You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何带Basic Auth的PHP CURL PUT请求未成功发送JSON数据?

正确实现带Basic Auth的PHP CURL PUT JSON请求

你的代码存在几个关键问题,导致API无法正确处理请求,以下是修正后的实现:

核心问题分析

  1. 数据格式错误:你用HEREDOC定义了JSON字符串,又调用json_encode($data),这会把JSON字符串再次转义成JSON格式,API无法解析实际的业务数据。
  2. HTTP头重复覆盖:你两次设置CURLOPT_HTTPHEADER,后面的数组会完全覆盖前面的,导致手动设置的Basic Auth头丢失;同时Basic Auth的头字段名应该是Authorization,不是Authentication。
  3. 冗余的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:10:06