在POST请求中设置API密钥时遇到问题

时间:2014-10-07 16:25:51

标签: php curl http-post

尝试通过curl发出API请求。 API文档说我必须按如下方式发出POST请求:

POST url
Headers: 
    Content-Type: “application/json”
Body:
{
    Context: {
        ServiceAccountContext: "[Authorization Token]"
    },
    Request:{
            Citations:[
            {
                Volume: int,
                Reporter: str,
                Page: int
            }
            ]   
    }
}

这是我的卷曲请求:

$postFields = array(
            'Volume' => int, 
            'Reporter' => str, 
            'Page' => int,
            'ServiceAccountContext' => $API_KEY
);   

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, true);       
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);    
curl_setopt($ch, CURLOPT_HEADER, false);     
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:application/json"));
curl_setopt($ch, CURLOPT_POST, count($postFields));        
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);         

$output=curl_exec($ch);  

但是API没有意识到我已经通过POST字段提交了API_KEY。我得到的错误是创建一个SecurityContext对象,我假设该对象与POST主体部分谈论Context和ServiceAccountContext有关。

我查看了cURL文档,但没有看到我如何设置它。有什么建议?谢谢一堆。

1 个答案:

答案 0 :(得分:1)

问题是您不正确地使用CURL选项。根据{{​​3}},当您将CURLOPT_POSTFIELDS选项设置为array时,CURL会将Content-Type标题强制为multipart/form-data。即忽略您设置CURLOPT_HTTPHEADER选项的行。

您必须先将$postFields转换为json_encode函数的JSON字符串,然后再将其传递给CURLOPT_POSTFIELDS选项:

...
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:application/json"));
curl_setopt($ch, CURLOPT_POST, true);       
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postFields));         
...