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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:00:01