通过PHP / Curl返回错误使用CloudFlare API

时间:2015-11-18 00:11:08

标签: php curl cloudflare

我正在通过PHP脚本更新我的DNS。我查看了与cURL相关的API文档,因此我尝试将cURL帖子转换为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"] = "someone@mydomain.com";
    $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的以下回复。

  

{&#34;成功&#34;:假,&#34;错误&#34;:[{&#34;代码&#34;:6003,&#34;消息&#34;:&#34;非法请求   标题&#34;,&#34; error_chain&#34;:[{&#34;代码&#34;:6100,&#34;消息&#34;:&#34;缺少X-Auth-Email   标题&#34;},{&#34;代码&#34;:6101,&#34;消息&#34;:&#34;缺少X-Auth-Key   标题&#34;},{&#34;代码&#34;:6105,&#34;消息&#34;:&#34;无效的内容类型标题,有效   价值观是   应用/ JSON,多部分/格式数据&#34;}]}],&#34;消息&#34;:[],&#34;导致&#34;:空}

我尝试将json_encode更改为http_build_query,但两者都返回相同的错误。

3 个答案:

答案 0 :(得分:6)

我认为你在滥用curl_setopt。

这是设置多个标头的正确方法:

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

编辑

更清楚地说明:

$headers = [ 
    'X-Auth-Email: someone@mydomain.com',
    'X-Auth-Key: MY_KEY',
    'Content-Type: application/json'
];

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

标题不是键/值对,而只是值。

此外,您应该使用http_build_query()发送POST数据。

答案 1 :(得分:1)

问题在于,当您从表单数据传递时,您要告诉它使用application/json。将您的内容类型设置为multipart/form-data,它应该有效。如果您想了解如何使用JSON API的示例,请与我们联系。

  

编辑: CURLOPT_HTTPHEADER不接受键/值,仅接受值。 More information

$fields["X-Auth-Email"] = "someone@mydomain.com"; 因此需要改为: $fields[]= "X-Auth-Email: someone@mydomain.com";

答案 2 :(得分:0)

我已经测试了这段代码,我认为你可以毫无问题地使用它。 例如:

    $request_headers = array(
    'X-Auth-Email: user@emailaddress.com',
    'X-Auth-Key: d820fa8fc881921323e08a2c19b8347896ac26',
    'Content-Type: application/json'
);

然后:

curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);