PHP CURL PUT使用CURLOPT_POSTFIELDS继续接收422错误

时间:2016-10-07 15:08:38

标签: php curl

我尝试编写一个脚本让php通过CURLOPT_CUSTOMREQUEST, 'PUT'为我做PUT请求但是我一直收到422错误(这意味着数据格式错误且无法处理)。

首先,我尝试直接在终端和邮递员发送PUT请求,两者都正常。请求的主体是一个简单的JSON格式:

{"status":"online"}

现在,这是我尝试过的代码:

  $ch = curl_init($url);
  curl_setopt_array($ch, array(        
    CURLOPT_HTTPHEADER => array( 'Authorization: "Panda is cute"' . "\r\n" . 'application/json; charset=utf-8' . "\r\n" . 'Content-Length: 19' . "\r\n" ),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'PUT',
    CURLOPT_POST => false,
    CURLOPT_POSTFIELDS => http_build_query( array ("status" => "online") )
  ));
  $out = curl_exec($ch);
  curl_close($ch);
  echo $out;

我尝试过对上面代码的一些修改。

  1. 我尝试了curl_setopt所有内容,而不是将它们全部放在curl_setopt_array
  2. 我尝试将CURLOPT_POST设置为true。
  3. 我试过CURLOPT_POSTFIELDS => json_encode( array ("status" => "online") )
  4. 我试过CURLOPT_POSTFIELDS => array ("status" => "online")
  5. 我试过CURLOPT_POSTFIELDS => '{"status":"online"}'
  6. 我试过CURLOPT_POSTFIELDS => 'http_build_query({"status":"online"})'
  7. 我试过CURLOPT_POSTFIELDS => 'http_build_query("status":"online")'
  8. 我尝试使用以上两个json_encode
  9. 我还使用curl_setopt尝试了以上所有内容。
  10. 我还尝试使用"代替我最喜欢的',就像我写的那样'PUT'
  11. 现在,当我使用非自定义PUT请求并上传文件时,它确实有效,但这是一个挑战,因为我的生产环境不允许我fopen()

    P.S。感谢下面的答案,我知道为什么它现在不起作用:

    CURLOPT_HTTPHEADER => array( 'Authorization: "Panda is cute"' . "\r\n" . 'application/json; charset=utf-8' . "\r\n" . 'Content-Length: 19' . "\r\n" )

    这一行会在标题的末尾添加一个"\r\n"(但如果没有它,php会接受我的原始语法,并会发布一条错误消息,而不是渲染标题),我身体的内容"\r\n"{"status":"online"}代替了。

1 个答案:

答案 0 :(得分:1)

PUT POSTMAN

生成的{p> PHP个请求
$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "http://www.stackoverflow.com/", //put your url here
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "PUT",
  CURLOPT_POSTFIELDS => "{\"status\":\"online\"}",
  CURLOPT_HTTPHEADER => array(
    "authorization: Panda is cute",
    "cache-control: no-cache",
    "content-type: application/json",
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}