尝试通过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文档,但没有看到我如何设置它。有什么建议?谢谢一堆。
答案 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));
...