【发布时间】:2014-07-11 21:37:16
【问题描述】:
我有一个可以从命令行运行的 cURL 请求,但我不知道如何将它转换为 cURL 的 PHP 实现。我相信我的问题在于正在发送的数据的格式,但我不能 100% 确定是这种情况。这是我要发送的 curl 命令:
# curl -X PUT -d '{"shared_link": {"access":"open"}}' \
-H "Authorization: Bearer ACCESSCODE" https://api.example.com/files/12345
我知道该命令有效!所以这就是我尝试在 PHP 中重现它的方式(我有各种其他 curl 命令在工作,但没有一个完全像这样)。
$url = 'https://api.example.com/files/1234';
$header = array('Authorization: Bearer ACCESSCODE');
$data = array('shared_link'=>array('access'=>'open'));
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,'PUT');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
$output = curl_exec($ch);
curl_close($ch);
return $output;
我期望得到(以及从命令行运行命令时我确实得到的)是来自 API 服务器的 JSON 响应,其中包含有关文件的所有信息,包括对“shared_link”值的更改。相反,我得到的是一个 JSON 响应,其中包含有关该文件的所有信息,“shared_link”值未更改。这与我发送 GET 请求或 PUT 请求相同,其中数据格式有效,但与任何可能更新的文件字段都不匹配。
所以我不知道我的请求的问题是数据的格式(这是我认为最有可能的)还是我是否正确配置 curl 来执行 PUT。我相信我正在按照我在许多其他示例中所描述的方式进行操作,但这对我来说仍然有点奇怪,所以我不能完全确定我做对了。此外,我可能在其他一些地方犯了我不认识的错误!
我尝试了多种不同的数据格式设置方法,但均不适合我,包括:
// This fails with 400 bad request
$data = http_build_query(array('shared_link'=>array('access'=>'open')));
// So does this
$data = urlencode("shared_link[access]=open");
// This fails because the JSON gets converted into objects,
// which POSTFIELDS won't accept
$data = json_decode('{"shared_link": {"access":"open"}}');
我要尝试的东西已经不多了。有人可以帮我弄清楚我做错了什么吗?如果我遗漏了任何相关信息,请告诉我,我很乐意提供。
提前致谢。
编辑:
原来答案是如此明显,以至于我忽略了它!
我所要做的就是:
$data = '{"shared_link": {"access": "open"}}'
是的,问题已回答。谢谢 CBroe!
在我的(某种)防御中,CURLOPT_POSTFIELDS (http://php.net/manual/en/function.curl-setopt.php) 的文档说该选项的值必须是数组或 urlencoded 字符串,这就是我正在做的。所以我是在这个假设下工作的,这显然是错误的,因为起作用的绝对不是数组也不是 urlencoded 字符串。
【问题讨论】:
-
为什么是
json_decode?您应该将适当的数据结构编码为 API 期望的 JSON 字符串格式。 -
天哪。我现在感觉异常愚蠢。谢谢。做到了。 >.