Guzzle实现Basic Auth异常:Postman测转储请求报401,应用返回200但结果不符
问题分析与解决方案
核心问题
- 请求体与Guzzle配置混淆:你把业务数据
Orders直接合并到了Guzzle的请求配置数组中,Guzzle不会将这部分内容作为JSON请求体发送,而是会当作无效的请求配置项处理,导致API未收到完整的业务数据。 - 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
相关产品推荐
相关产品推荐

