Использование CloudFlare API через PHP / Curl возвращает ошибку
Я работаю над обновлением DNS с помощью PHP-скрипта. Я посмотрел документацию API, относящуюся к cURL, поэтому я пытаюсь преобразовать cURL psot в PHP.
У меня есть следующий код:
$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.
{"success": false, "errors": [{"code": 6003, "message": "Invalid request
заголовки","error_chain":[{"код":6100,"сообщение":"отсутствует х-авт-по электронной почте
заголовок"}, {"код": 6101, "сообщение": "отсутствует X-Auth-Ключ
заголовок"}, {"код": 6105, "сообщение": "недопустимый заголовок типа содержимого, допустимый
ценности есть
application/json, multipart / form-data"}]}], "messages": [], "result": null}
Я попытался изменить код json_encode на http_build_query, но оба возвращают одну и ту же ошибку.
Спасибо за любую помощь, которую вы можете оказать.
3 ответов:
Я думаю, что вы злоупотребляете curl_setopt.
Это правильный способ сделать set multiple header:
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().
Проблема в том, что вы говорите ему использовать
application/json, когда вы передаете ему данные формы. Установите свой тип контента вmultipart/form-data, и он должен работать. Если вам нужен пример использования API JSON, дайте мне знать.EDIT: CURLOPT_HTTPHEADER не принимает ключ / значения, только значения. дополнительная информация
$fields["X-Auth-Email"] = "[email protected]";поэтому необходимо было бы изменить на:$fields[]= "X-Auth-Email: [email protected]";
Я протестировал этот код и думаю, что вы можете использовать его без каких-либо проблем. Пример:
$request_headers = array( 'X-Auth-Email: [email protected]', 'X-Auth-Key: d820fa8fc881921323e08a2c19b8347896ac26', 'Content-Type: application/json' );Затем:
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
Comments