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响应,但实际得到网页的登录视图。
核心原因分析
验证规则错误触发验证失败
注册方法里的username字段错误使用了email验证规则:'username' => 'required|string|email|max:255|unique:users',但传入的
username=llrr00不符合邮箱格式,直接触发验证失败。请求头缺失导致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
相关产品推荐
相关产品推荐

