2015-11-18 1 views
2

Я работаю над обновлением своего DNS с помощью PHP-скрипта. Я просмотрел документацию API, относящуюся к cURL, поэтому я пытаюсь преобразовать cURL psot в PHP.Использование CloudFlare API через ошибку PHP/Curl, возвращающую ошибку

У меня есть следующий код:

$ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://api.cloudflare.com/client/v4/zones/<MY_ZONE>/dns_records/<MY_ID>"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_VERBOSE, 1); 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); 

    $fields = array(); 
    $fields["X-Auth-Email"] = "[email protected]"; 
    $fields["X-Auth-Key"] = "MY_KEY"; 
    $fields["Content-Type"] = "application/json"; 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $fields); 

    $dnsData = array(); 
    $dnsData["id"] = "MY_ID"; 
    $dnsData["type"] = "A"; 
    $dnsData["name"] = "home"; 
    $dnsData["content"] = $newIPAddress; 

    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($dnsData)); 


    echo "posting to API<br />"; 
    $result = curl_exec($ch); 
    echo "Result: " . $result; 

С выше код я получаю следующий ответ от Cloudflare.

{ "успех": ложный, "ошибка": [{ "код": 6003, "сообщение": "Неверный запрос заголовков", "error_chain": [{ "код": 6100, "сообщение ":" Отсутствует X-Auth-Email header "}, {" code ": 6101," message ":" Missing X-Auth-Key header "}, {" code ": 6105," message ":" Invalid заголовок Content-Type, действительные значения приложения/JSON, многочастному/форм-данных "}]}]," сообщения ": []," результат ": нулевой}

Я попытался изменить json_encode в http_build_query, но оба возвращают ту же ошибку.

Спасибо за любую помощь, которую вы можете предоставить.

ответ

4

Я думаю, что вы злоупотребляете curl_setopt.

Это правильный способ сделать установить несколько заголовков:

curl_setopt($ch,CURLOPT_HTTPHEADER, ['HeaderName: HeaderValue','HeaderName2: HeaderValue2']); 

EDIT

Чтобы сделать его более ясным:

$headers = [ 
    'X-Auth-Email: [email protected]', 
    'X-Auth-Key: MY_KEY', 
    'Content-Type: application/json' 
]; 

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

заголовки не пара ключ/значение, а скорее значения.

Кроме того, вы должны отправить данные POST с помощью http_build_query().

1

Проблема в том, что вы говорите, что используете application/json, когда вы передаете данные формы. Установите свой Content-type на multipart/form-data, и он должен работать. Если вам нужен пример использования JSON API, дайте мне знать.

EDIT: CURLOPT_HTTPHEADER не принимает ключ/значение, только значения. More information

$fields["X-Auth-Email"] = "[email protected]"; поэтому необходимо будет изменить: $fields[]= "X-Auth-Email: [email protected]";

0

Я тестировал этот код и я думаю, что вы можете использовать его без каких-либо проблем. пример:

$request_headers = array(
    'X-Auth-Email: [email protected]', 
    'X-Auth-Key: d820fa8fc881921323e08a2c19b8347896ac26', 
    'Content-Type: application/json' 
); 

тогда:

curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);