I always getting the same error (Create domain ‘example.com’ failed) (or any domain) when trying to create new DNS zone with Powerdns API call.
My request:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://127.0.0.1:953/api/v1/servers/localhost/zones');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{"name":"example.com.", "kind":"Native", "masters": [], "nameservers":["ns1.example.com.", "ns2.example.com."]}");
$headers = array();
$headers[] = 'X-Api-Key: MY-KEY';
$headers[] = 'Accept: application/json';
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
Similar api call to get a list of DNS zones is working. GET request work properly but not POST.
Can anyone help, please?
My pdns.conf file is:
api=yes
api-key=MY-KEY
Maybe i have to change something in settings of my powerdns, idk really.
I would be very grateful for any help!
Server response after POST request is 422 error (Unprocessable Entity)
HTTP/1.1 422 Unprocessable Entity
Access-Control-Allow-Origin: *
Connection: close
Content-Length: 52
Content-Security-Policy: default-src ‘self’; style-src ‘self’ ‘unsafe-inline’
Content-Type: application/json
Server: PowerDNS/4.4.1
X-Content-Type-Options: nosniff
X-Frame-Options: deny
X-Permitted-Cross-Domain-Policies: none
X-Xss-Protection: 1; mode=block
This is my pdns.conf file
cat /etc/pdns/pdns.conf
bind-ignore-broken-records=yes
setuid=named
setgid=named
launch=bind
log-dns-queries=yes
loglevel=5
bind-config=/etc/named.conf
bind-dnssec-db=/var/cpanel/pdns/dnssec.db
local-address-nonexist-fail=no
distributor-threads=1
disable-axfr=yes
webserver=yes
api=yes
webserver-address=127.0.0.1
webserver-allow-from=0.0.0.0/0
webserver-password=SERVER-KEY
#gmysql-dnssec=no
webserver-port=953
api-key=MY-KEY
upgrade-unknown-types=1
2
Answers
Your code looks correct.
One big problem with your response.
Content-Length: 52
It should be
Content-Length: 111
.I have been testing your code with two apps
One to send the curl request
One to receive it and respond with the request details.
Early on in my testing when I removed the
Content-Type: application/json
,I would see a content length of just over 50 bytes.
Below is my app. It gets 111 bytes.
If you change your curl url to http://eatled.com/receiveheader.php
You should get this:
LINK TO MY CURL SANDBOX
The source code:
sandbox.php
receiveheaders.php
END OF UPDATE
Add these two headers.
Right now the error you are getting is because the request content-type is
If use just used the content-type header and not accept, you’d get a different error. The API manual says you cannot use curl’s default
Accept: */*
Can you try call the API using curl command on the maching running pDNS webserver?
Because I don’t know your setup, so I guess that it had something relate to network. If
curl
request work, you should checkwebserver-allow-from
configuration, you may try to set it to accept from all (0.0.0.0,::
).