Laravel API返回视图404错误而不是JSON错误。

10 浏览
0 Comments

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);
}

0
0 Comments

当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而不是视图。

0
0 Comments

问题的原因是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)

0
0 Comments

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头部。因此,确保在请求中传递正确的头部信息。

0