如何使用cURL发送带JSON请求体的PUT请求?
如何用PHP CURL发送带请求体的PUT请求
之前的代码踩了两个坑:一是CURLOPT_BODY根本不是PHP CURL的合法选项,二是直接用CURLOPT_POSTFIELDS会默认转成POST请求。给你两种靠谱的解决办法:
方法一:指定PUT方法+用POSTFIELDS传数据(推荐)
直接用CURLOPT_CUSTOMREQUEST强制指定请求方法为PUT,同时用CURLOPT_POSTFIELDS传递JSON数据,完全不会变成POST请求。记得一定要加Content-Type请求头,不然服务端大概率解析不了你的JSON。
示例代码:
$url = "你的接口地址"; $postData = ["name" => "test", "status" => 1]; // 要发送的业务数据 $ch = curl_init($url); // 强制设置请求方法为PUT curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // 传递JSON格式的请求体 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); // 设置请求头,告诉服务端这是JSON数据 curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Content-Type: application/json", "Content-Length: " . strlen(json_encode($postData)) // 可选,部分服务端需要这个头 ]); // 可选:开启后curl_exec会返回响应内容,而不是直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求并处理结果 $response = curl_exec($ch); if (curl_errno($ch)) { echo "CURL出错:" . curl_error($ch); } curl_close($ch); // 打印响应结果看看 var_dump($response);
方法二:用CURLOPT_PUT配合临时文件(传统写法)
如果非要用CURLOPT_PUT这个选项,那得把请求体写到临时文件里,因为CURLOPT_PUT要求从文件读取请求数据。这种写法比较麻烦,不推荐,但可以了解下:
$url = "你的接口地址"; $postData = json_encode(["name" => "test", "status" => 1]); // 创建临时文件并写入数据 $tempFile = tmpfile(); fwrite($tempFile, $postData); fseek($tempFile, 0); // 把文件指针移到开头,不然curl读不到内容 $ch = curl_init($url); curl_setopt($ch, CURLOPT_PUT, true); // 指定要读取的文件句柄 curl_setopt($ch, CURLOPT_INFILE, $tempFile); // 指定文件大小,curl会根据这个设置Content-Length头 curl_setopt($ch, CURLOPT_INFILESIZE, strlen($postData)); // 同样要设置JSON请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); if (curl_errno($ch)) { echo "CURL出错:" . curl_error($ch); } curl_close($ch); fclose($tempFile); // 关闭临时文件,系统会自动删除它 var_dump($response);
注意事项
- 别同时设置
CURLOPT_PUT和CURLOPT_CUSTOMREQUEST,会冲突导致请求异常。 - 不管用哪种方法,
Content-Type头一定要加,否则服务端可能把你的JSON当成普通字符串处理。
内容的提问来源于stack exchange,提问作者Bart Friederichs
相关产品推荐
相关产品推荐

