PHP cURL PUT请求数据是数组的位置

时间:2014-07-11 21:37:17

标签: php curl put

我有一个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字符串。

1 个答案:

答案 0 :(得分:-1)

你可以试试这个

$post_body = http_build_query(
      array(
        'shared_link[access]' =>  'open'
        )
    );

之后,将curl opt传递给curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode($post_body));