PHP CURL PUT在使用CURLOPT_POSTFIELDS时一直收到422错误


PHP CURL PUT keep receiving 422 error whiling using CURLOPT_POSTFIELDS

我试图写一个脚本让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'

现在,当我使用非自定义PUT请求并上传文件时,它确实有效,但这是一个挑战,因为我的生产环境不允许我做fopen()

注:谢谢你的回答,我知道为什么它现在不起作用了:

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"}

POSTMANPHP生成的PUT请求

$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;
}