php curl找不到密钥

时间:2015-03-12 07:55:13

标签: php curl

我正在尝试编写一个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有关,但由于所需的参数似乎只是一个字符串而我使用相同的字符串,我无法分辨它是怎么回事。

2 个答案:

答案 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