Return 每个请求都是普通的 json Laravel 使用中间件

Return every request as plain json Laravel using Middleware

我的 web.php 中有一条路线 returns 一个视图:

Route::get('/', function () {
    return view('welcome');
});

欢迎是默认 Laravel 查看 welcome.blade.php。

我有一个名为 AlwaysReturnJson 的中间件,它包含:

<?php

namespace App\Http\Middleware;

use Closure;

class AlwaysReturnJson
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        $request->headers->set('Accept', 'application/json');
        return $next($request);
    }
}

我在 Kernel.php 中将这个中间件设置为全局中间件:

 protected $middleware = [
        \App\Http\Middleware\AlwaysReturnJson::class
    ];

我期望的是当我导航到给定路线时在我的浏览器中获得欢迎文件的纯 text/json,但我总是得到它作为 html 并且它正确呈现页面。我检查了它,它在每个请求上应用中间件,所以这不是问题。为什么会发生这种情况,它不应该将该视图转换为纯文本吗?我做错了什么吗?

如果您想为您的回复设置 header,您可以这样做:

namespace App\Http\Middleware;

use Closure;

class AlwaysReturnJson
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        $response->headers->set('Content-Type', 'application/json');

        return $response;
    }
}

如果您想强制 return 有效 json 内容,请改用此中间件:

namespace App\Http\Middleware;

use Closure;

class AlwaysReturnJson
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        return response()->json($response->getContent());
    }
}

有关 after middleware 的文档,请参阅 Laravel 了解更多信息。

您也可以 return json 在您的控制器上响应,无需任何中间件:

Route::get('/', function () {
    return response()->json(
        view('welcome')->render()
    );
});

您可能需要使用 laravel 后中间件(中间件将在应用程序处理请求后执行其任务),然后设置响应的内容类型。

<?php

namespace App\Http\Middleware;

use Closure;

class AfterAlwaysReturnJson
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        return $response->header('Content-Type', 'application/json');
    }
}