Laravel API返回视图404错误而不是JSON错误。
Laravel API返回视图404错误而不是JSON错误。
我正在尝试使用laravel创建一个RESTful API,我试图使用无效的ID获取资源,结果是404,因为找不到,但我的问题是响应不是JSON格式,而是一个默认的HTML视图404。有没有办法将响应转换为JSON?对于这种情况,我使用了Homestead。
我尝试包含一个回退路由,但似乎不适合这种情况。
Route::fallback(function () { return response()->json(['message' => 'Not Found.'], 404); });
我尝试修改处理器(App\Exceptions),但没有任何变化。
public function render($request, Exception $e) { if ($e instanceof ModelNotFoundException) { if ($request->ajax()) { return response()->toJson([ 'message' => 'Not Found.', ], 404); } } return parent::render($request, $e); }
当Laravel API返回一个视图404错误而不是JSON错误时,这个问题的出现原因是没有正确设置请求头导致的。解决方法是添加一个新的中间件,该中间件会为所有请求添加['accept' => 'application/json']请求头,以确保所有响应都返回JSON而不是视图。
具体解决方法如下:
首先,在项目的app/Http/Middleware目录下创建一个AddAjaxHeader.php文件,内容如下:
headers->add(['accept' => 'application/json']); return $next($request); } }
然后,将这个中间件添加到Kernel.php文件中的api中间件组中,代码如下:
protected $middlewareGroups = [ 'web' => [ // ... ], 'api' => [ \App\Http\Middleware\AddAjaxHeader::class, // ... ], ];
这样,当你的项目只是一个RESTful API而没有视图时,所有的请求都会自动添加'accept' => 'application/json'请求头,确保所有响应都返回JSON而不是视图。
问题的原因是Laravel API返回一个视图404错误而不是JSON错误。解决方法是在App/Exceptions/Handler.php文件中注册异常处理回调函数,并根据请求路径判断是否返回JSON响应。
在Laravel 9中,可以使用以下代码来处理ModelNotFoundException异常,并获取模型名称和ID:
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Register the exception handling callbacks for the application. * * void */ public function register() { $this->renderable(function (NotFoundHttpException $e, $request) { if ($request->is('api/*')) { return response()->json([ 'message' => 'Record not found.' ], 404); } }); }
如果需要检查ModelNotFoundException实例,并获取模型名称和ID,可以参考以下链接中的代码示例进行处理:[stackoverflow.com/a/75492554/14344959](https://stackoverflow.com/a/75492554/14344959)
Laravel API返回视图404错误而不是JSON错误的原因是因为请求中没有正确设置Accept头部为'application/json'。如果在请求中正确设置了Accept头部,那么Laravel框架中的Illuminate\Foundation\Exceptions\Handler类会在响应的render方法中进行格式化处理。具体代码如下:
return $request->expectsJson() ? $this->prepareJsonResponse($request, $e) : $this->prepareResponse($request, $e);
而对于使用return response()->json()
方法返回JSON响应的情况,Laravel框架已经自动设置了正确的头部。
需要注意的是,上述内容中提到的是请求而不是响应。如果希望获得JSON响应,应该在请求中设置Accept头部为'application/json'。expectsJson
方法检查的是Accept头部是否包含'application/json',而不是Content-Type头部。因此,确保在请求中传递正确的头部信息。