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

Guzzle实现Basic Auth异常:Postman测转储请求报401,应用返回200但结果不符

问题分析与解决方案

核心问题

  1. 请求体与Guzzle配置混淆:你把业务数据Orders直接合并到了Guzzle的请求配置数组中,Guzzle不会将这部分内容作为JSON请求体发送,而是会当作无效的请求配置项处理,导致API未收到完整的业务数据。
  2. Basic Auth参数错误:API要求仅使用token(无需密码),但你传入了$this->password值,不符合API的授权规则。Postman中选择Basic Auth时,你应该是只填了token、密码留空,这才是正确的授权方式。

修正后的代码

$client = new GuzzleHttp\Client([
    'http_errors' => $this->errors,
    'base_uri' => $this->base_uri,
    'verify' => false
]);

// 构建请求配置
$requestOptions = [
    'headers' => [
        'Accept' => 'application/json'
    ]
];

// 处理Basic Auth:token作为用户名,密码传空字符串
if (isset($this->token['token'])) {
    $requestOptions['auth'] = [
        $this->token['token'],
        '' // 密码留空,匹配API授权要求
    ];
}

// 将业务数据放入`json`选项,Guzzle会自动编码为JSON并设置Content-Type头
$requestOptions['json'] = [
    'Orders' => [
        // 你的合法订单JSON数据
    ]
];

$response = $client->request($method, $uri, $requestOptions);
$data = json_decode($response->getBody()->getContents());

return $data;

关键说明

  • 区分配置与请求体:Guzzle的请求配置数组中,auth、headers属于请求配置项,业务数据必须放在json(或form_params、body)选项中,这样Guzzle才会正确处理请求体并发送给API。
  • Basic Auth正确格式:Basic Auth的规则是对用户名:密码进行Base64编码,当API仅要求token时,用户名填token、密码填空字符串,生成的授权头才和Postman操作的一致。
  • 自动设置Content-Type:使用json选项时,Guzzle会自动添加Content-Type: application/json头,无需手动设置,确保API能正确解析请求体。

内容的提问来源于stack exchange,提问作者Tom Davison

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:23:32