为何带Basic Auth的PHP CURL PUT请求未成功发送JSON数据?
正确实现带Basic Auth的PHP CURL PUT JSON请求
你的代码存在几个关键问题,导致API无法正确处理请求,以下是修正后的实现:
核心问题分析
- 数据格式错误:你用HEREDOC定义了JSON字符串,又调用
json_encode($data),这会把JSON字符串再次转义成JSON格式,API无法解析实际的业务数据。 - HTTP头重复覆盖:你两次设置
CURLOPT_HTTPHEADER,后面的数组会完全覆盖前面的,导致手动设置的Basic Auth头丢失;同时Basic Auth的头字段名应该是Authorization,不是Authentication。 - 冗余的Auth配置:同时手动设置Authorization头和使用
CURLOPT_USERPWD+CURLOPT_HTTPAUTH,可能引发冲突。
修正后的代码
// 直接定义PHP数组,再转为JSON,避免格式错误 $data = [ "name" => "John", "age" => "32", "address" => [ "city" => "London", "street" => "Laxin street 32", "zip" => "32567" ] ]; $data_json = json_encode($data); $url = "https://www.website.com/record?apiKey={API_KEY}"; $username = "user"; $password = "123abcd"; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "PUT", // 生产环境建议开启SSL验证,测试环境可临时关闭 CURLOPT_SSL_VERIFYPEER => true, // 使用CURLOPT_USERPWD+CURLOPT_HTTPAUTH自动处理Basic Auth,更可靠 CURLOPT_USERPWD => $username . ":" . $password, CURLOPT_HTTPAUTH => CURLAUTH_BASIC, // 指定用Basic Auth,避免自动选择的不确定性 CURLOPT_POSTFIELDS => $data_json, CURLOPT_HTTPHEADER => [ "Cache-Control: no-cache", "Content-Type: application/json", "TOKEN: SAMPLE_TOKEN" ], ]); $response = curl_exec($curl); // 调试:输出CURL错误信息,方便排查问题 if(curl_errno($curl)){ echo "CURL Error: " . curl_error($curl); } curl_close($curl);
额外注意事项
- 确认API的PUT接口是否需要在URL中指定具体记录ID(比如
https://www.website.com/record/123?apiKey={API_KEY}),如果缺少记录标识,API可能无法确定要修改的资源,返回原始数据。 - 生产环境务必开启
CURLOPT_SSL_VERIFYPEER,避免安全风险。 - 可以通过
var_dump(json_decode($response, true))查看API返回的详细响应,确认是否有错误提示。
内容的提问来源于stack exchange,提问作者newert
相关产品推荐
相关产品推荐

