首页 > 解决方案 > Laravel:用 UTF-8 编码 JSON 响应

问题描述

我想将我的 API 的 JSON 响应编码为 UTF-8,但每次我做出响应时,我都不想这样做:

return response()->json($res,200,['Content-type'=>'application/json;charset=utf-8'],JSON_UNESCAPED_UNICODE);

所以我想为所有 API 路由制作一个中间件,它的handle(...)功能是这样的:

public function handle($request, Closure $next) {
    $response = $next($request);
    $response->header('Content-type','application/json; charset=utf-8');
    return $next($request);
}

问题是它不起作用,Content-type我的回复的标题仍然是application/json而不是application/json; charset=utf-8;也许是因为该json(...)函数已经设置了一个Content-type标题,我无法覆盖它。

我应该怎么做?

谢谢您的帮助。

标签: jsonlaravelutf-8laravel-middleware

解决方案


它就在文档中,您想中间件之后使用(以下代码来自我的脑海,它应该可以工作):

<?php

namespace App\Http\Middleware;

use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {

        /** @var array $data */ // you need to return array from controller
        $data = $next($request);

        return response()->json($data, 200, ['Content-Type' => 'application/json;charset=UTF-8', 'Charset' => 'utf-8'],
        JSON_UNESCAPED_UNICODE);
    }
}

通过上述方法,我们可以发现两种反模式:

  • 在中间件中制作响应(你应该在控制器中做)
  • 使用未转义的 JSON 响应,Laravel 的创建者默认转义了,那为什么要改变它呢?!

删除中间件并仅使用控制器

将以下代码放入app/Http/Controller.php

protected function jsonResponse($data, $code = 200)
{
    return response()->json($data, $code,
        ['Content-Type' => 'application/json;charset=UTF-8', 'Charset' => 'utf-8'], JSON_UNESCAPED_UNICODE);
}

在由基本控制器(app/Http/Controller.php)扩展的任何控制器中,您可以使用$this->jsonResponse($data);

专业人士是如何做到的

他们使用雄辩的资源,或者如果有更多的分形是要走的路(在 Laravel 中使用 spatie 包装器 - https://github.com/spatie/laravel-fractal)。


推荐阅读