php - 你如何在 Laravel 中强制对每个响应进行 JSON 响应?

标签 php json rest laravel

我正在尝试使用 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/

相关文章:

node.js - Nodejs Express - 大块在 res.on ('data' 中被记录两次)

jquery - Localstorage to JSON : How can I delete only 1 array inside a key since localstorage. remove Item 需要整个key

php - Laravel Controller 无法获取 cookie

php - 在 SQL 语句中,如果没有找到特定查询的任何内容,则返回一个条目

php - 简化代码

ios - 数据未显示在 TableViewController 上

json - CasperJs 从本地文件加载json数据

java - 超时休息服务

objective-c - 如何通过json api更新服务器数据库上的数据?

php - 使用数组搜索数据库,然后使用 PHP 在 foreach 循环中回显/打印结果