Laravel用Http门面发POST请求返回406 Not Acceptable如何解决
问题定位与解决
406 Not Acceptable 错误的核心原因是目标API服务端校验了请求的Accept头,无法生成符合该头要求的响应格式,因此直接拒绝请求。Postman请求正常是因为其默认携带Accept: */*通配符头,没有限制响应格式,而Laravel Http Facade默认请求头配置与Postman不一致触发了校验。
定位步骤
先打印当前请求的完整头信息,和Postman请求头做对比,确认Accept字段差异:
$response = Http::post( $this->api.'/auth', [ 'auth' => [ 'username' => $this->username, 'password' => $this->password ] ] ); // 打印本次请求所有头信息 dd(Http::getLastRequest()->getHeaders());
解决方案
方案1:指定JSON响应格式
如果目标接口返回JSON格式,直接添加acceptJson()方法即可:
$response = Http::acceptJson() ->post( $this->api.'/auth', [ 'auth' => [ 'username' => $this->username, 'password' => $this->password ] ] )->json('response');
方案2:使用通配符Accept头
不清楚目标接口响应格式时,直接和Postman保持一致使用通配符:
$response = Http::accept('*/*') ->post( $this->api.'/auth', [ 'auth' => [ 'username' => $this->username, 'password' => $this->password ] ] )->json('response');
方案3:适配请求体格式
如果修改Accept后仍报错,检查请求体格式是否符合服务端要求:
- 要求form-data格式提交:添加
asForm()方法 - 要求JSON格式提交:添加
asJson()方法(Laravel默认POST数组时已自动开启,大部分场景无需额外配置)
验证方法
修改后先打印完整响应体确认返回正常:
$response = Http::acceptJson() ->post($this->api.'/auth', [ 'auth' => [ 'username' => $this->username, 'password' => $this->password ] ]); // 打印完整响应内容,确认格式正确后再调用json()方法 dd($response->body());
内容的提问来源于stack exchange,提问作者Snowfire
相关产品推荐
相关产品推荐

