我正在尝试使用 Laravel Framework 构建一个 REST api,我想要一种方法来强制 API 始终响应 JSON,而不是像这样手动操作:
return Response::json($data);
换句话说,我希望每个响应都是 JSON。有什么好的方法吗?
Update: The response must be JSON even on exceptions like not found exception.
最佳答案
按照 Alexander Lichter 的建议创建一个中间件在每个请求上设置 Accept
header :
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ForceJsonResponse
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$request->headers->set('Accept', 'application/json');
return $next($request);
}
}
将其添加到app/Http/Kernel.php
文件中的$routeMiddleware
:
protected $routeMiddleware = [
(...)
'json.response' => \App\Http\Middleware\ForceJsonResponse::class,
];
您现在可以包装所有应该返回 JSON 的路由:
Route::group(['middleware' => ['json.response']], function () { ... });
编辑:对于 Laravel 6.9+
赋予 json.response
中间件高于其他中间件的优先级 - 以处理请求在您到达之前被其他中间件(例如 Authorize
中间件)终止的情况设置 Accept
header 。
要做到这一点 - 重写你 App\Http\Kernel
类(app/Http/Kernel.php
)的构造函数:
public function __construct( Application $app, Router $router ) {
parent::__construct( $app, $router );
$this->prependToMiddlewarePriority(\App\Http\Middleware\ForceJsonResponse::class);
}
关于php - 你如何在 Laravel 中强制对每个响应进行 JSON 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36366727/