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

Laravel后端返回状态码异常,Android Retrofit始终收到200而非预期4xx状态码

Laravel后端返回状态码异常,Android Retrofit始终收到200而非预期4xx状态码

我帮你分析了下,问题大概率出在Laravel控制器里的->send()调用上,这是个常见的新手误区,咱们一步步来解决:

1. 问题根源:不该在Laravel控制器中手动调用->send()

Laravel的设计逻辑是:控制器方法只需返回响应实例,框架会自动完成响应的发送流程(包括经过全局中间件处理、设置响应头、发送状态码等)。

而你在每个响应返回时都加了->send(),这会直接跳过Laravel的响应处理链,提前把响应推给客户端。这种操作很容易触发框架的后续处理冲突,导致状态码被意外重置为200,这就是Android端始终收到200的核心原因。

2. 修改Laravel代码:移除所有->send()调用

把控制器中所有返回响应的->send()都删掉,只保留响应实例的返回即可。修改后的核心代码如下:

public function loginWithUsername(Request $request) {
    $data = $request->only('username', 'password');
    $rules = [
        'username' => 'required|max:255',
        'password' => 'required',
    ];

    $validator = Validator::make($data, $rules);
    if ($validator->fails()) {
        // 移除->send()
        return response()->json(['errors' => $validator->errors()], 422);
    } else {
        $username = $request->username;
        $user = User::where('username', $username)->first();

        if (!$user) {
            // 移除->send()
            return response()->json(['error' => __('messages.invalid-username')], 404);
        } else if (!Hash::check($request->password, $user->password)) {
            // 移除->send()
            return response()->json(['error' => __('messages.invalid-password')], 401);
        }
        // 后续逻辑...
    }
}

3. 验证修改效果

修改完成后,先通过Postman/Insomnia等工具直接测试接口:

  • 不传用户名密码,应该收到422状态码
  • 传不存在的用户名,收到404
  • 用户名正确密码错误,收到401

确认接口状态码正常后,再测试Android端,这时候Retrofit的response.code()应该能拿到正确的状态码了。

4. 额外排查(如果修改后仍有问题)

如果还是出现状态码异常,可以检查这两个点:

  • 查看Laravel的app/Http/Kernel.php全局中间件,有没有自定义中间件会强制修改响应状态码(比如某些错误捕获中间件)
  • 检查Android端Retrofit的拦截器配置,确保没有拦截器会篡改响应状态码

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 10:14:37