我试图写一个脚本让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;
我对上面的代码做了一些修改。
- 我尝试了
curl_setopt
的一切,而不是把它们都放在curl_setopt_array
- 我尝试将
CURLOPT_POST
设置为true。 - 我试过
CURLOPT_POSTFIELDS => json_encode( array ("status" => "online") )
- 我试过
CURLOPT_POSTFIELDS => array ("status" => "online")
- 我试过
CURLOPT_POSTFIELDS => '{"status":"online"}'
- 我试过
CURLOPT_POSTFIELDS => 'http_build_query({"status":"online"})'
- 我试过
CURLOPT_POSTFIELDS => 'http_build_query("status":"online")'
- 我尝试了以上两个
json_encode
。 - 我也尝试了以上所有的
curl_setopt
。 - 我也试着用
"
代替我最喜欢的'
在任何地方,我可以,就像我写'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"}
。
从POSTMAN
到PHP
生成的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;
}