我尝试编写一个脚本让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()
。
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"}
代替了。
答案 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;
}