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

Laravel POST请求未返回JSON响应,反而返回登录视图问题排查

问题排查:Laravel注册接口返回登录视图的原因

问题场景

编写了如下AuthController控制器:

class AuthController extends Controller
{
    public function login(Request $request)
    {
        if (!Auth::attempt($request->only('email', 'password'))) {
            return response()->json([
                'message' => 'Invalid login details'
            ], 401);
        }

        $user = User::where('email', $request['email'])->firstOrFail();

        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json([
            'access_token' => $token,
            'token_type' => 'Bearer',
        ]);
    }

    public function register(Request $request)
    {
        $validatedData = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'username' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8',
        ]);

        $user = User::create([
            'name' => $validatedData['name'],
            'email' => $validatedData['email'],
            'username' => $validatedData['username'],
            'password' => Hash::make($validatedData['password']),
        ]);

        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json([
            'access_token' => $token,
            'token_type' => 'Bearer',
        ]);
    }

    public function me(Request $request)
    {
        return $request->user();
    }
}

API路由配置(api.php):

Route::post('/me', [AuthController::class, 'me'])->middleware('auth:sanctum');
Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);

使用Postman向http://127.0.0.1/api/register发起POST请求,携带参数:name=luis ruiz flores&email=luis@gmail.com&username=llrr00&password=password,预期返回包含access_token和token_type的JSON响应,但实际得到网页的登录视图。


核心原因分析

  1. 验证规则错误触发验证失败
    注册方法里的username字段错误使用了email验证规则:

    'username' => 'required|string|email|max:255|unique:users',
    

    但传入的username=llrr00不符合邮箱格式,直接触发验证失败。

  2. 请求头缺失导致Laravel判定为网页请求
    Laravel处理验证失败时,会根据请求类型返回响应:

    • 若请求头包含Accept: application/json,则返回JSON格式错误信息;
    • 若未设置该请求头,Laravel会判定为普通网页请求,重定向到登录页面(取决于项目默认配置)。
      你在Postman中发起请求时未设置正确的请求头,因此返回了登录视图。

解决方案

1. 修正username的验证规则

移除email规则,改为符合需求的规则,比如仅限制字符长度和唯一性:

'username' => 'required|string|max:255|unique:users',

2. 在Postman中添加正确的请求头

在请求的Headers模块中添加:

  • Accept: application/json
  • (可选)Content-Type: application/x-www-form-urlencoded(匹配你使用的表单传参格式)

3. (可选)强制API路由返回JSON响应

如果希望所有API路由的验证失败都返回JSON,可以在app/Exceptions/Handler.php中修改render方法,或者利用Laravel的API路由组特性,确保所有API请求被正确识别为JSON请求。


内容的提问来源于stack exchange,提问作者Luis Daniels

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:02:49