我正在尝试编写一个php curl脚本调用api,但是文档(http://rest.ensembl.org/documentation/info/vep_region_post)只列出了其他语言,我无法在php curl中使用它。 在文档中,命令行curl中的示例调用(我确认可以使用)是:
curl 'http://rest.ensembl.org/vep/homo_sapiens/region' -H 'Content-type:application/json' \
-H 'Accept:application/json' -X POST -d '{ "variants" : ["21 26960070 rs116645811 G A . . .", "21 26965148 rs1135638 G A . . ." ] }'
我试图在php curl中复制这个:
$session = curl_init();
curl_setopt($session, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($session, CURLOPT_POST, 1);
curl_setopt($session, CURLOPT_URL,'http://rest.ensembl.org/vep/homo_sapiens/region');
curl_setopt($session, CURLOPT_HTTPHEADER, array("Content-Type" => "application/json", "Accept" => "application/json"));
curl_setopt($session, CURLOPT_POSTFIELDS, '{ "variants" : ["21 26960070 rs116645811 G A . . .", "21 26965148 rs1135638 G A . . ." ] }');
echo(curl_exec($session));
curl_close($session);
我得到的结果是:
{"错误":"找不到\" variants \"在POST中输入密钥。请根据文档"}
检查邮件的格式问题似乎与CURLOPT_POSTFIELDS有关,但由于所需的参数似乎只是一个字符串而我使用相同的字符串,我无法分辨它是怎么回事。
答案 0 :(得分:1)
您不能将带有空格的字符串作为POST字符串传递。你需要对它进行urlencode:
curl_setopt($session, CURLOPT_POSTFIELDS, urlencode('{ "variants" : ["21 26960070 rs116645811 G A . . .", "21 26965148 rs1135638 G A . . ." ] }'));
答案 1 :(得分:0)
远程服务器无法理解您的请求,因为它的传递方式为:
Content-Type: application/x-www-form-urlencoded
这是Content-Type
次请求的默认POST
。
这是因为您的代码无法正确设置所需的标头。 PHP documentation解释说:
CURLOPT_HTTPHEADER :要设置的HTTP标头字段数组,格式为数组('内容类型:text / plain','内容长度:100& #39;)
以正确的方式设置标题,它将起作用:
curl_setopt($session, CURLOPT_HTTPHEADER,
array("Content-Type: application/json", "Accept: application/json"));
备注:不要urlencode()
POST
个字段(如另一个答案所示);您发送的数据不是查询字符串。
您的Content-Type
标题显示为application/json
,请确保您发送的数据是正确的JSON
。