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
相关产品推荐
相关产品推荐

