Laravel:用 UTF-8 编码 JSON 响应

Posted

技术标签:

【中文标题】Laravel:用 UTF-8 编码 JSON 响应【英文标题】:Laravel: Encode JSON responses in UTF-8 【发布时间】:2018-11-15 22:32:13 【问题描述】:

我想将我的 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 标头,我无法覆盖它。

我该怎么办?

感谢您的帮助。

【问题讨论】:

你需要换一种方式,你想使用 after middleware. 我不明白你的意思。 $request->header('key', 'default') 是您正在执行 NOP(无操作)的那一行中的吸气剂。 你是对的。我添加了$response = $next($request); 并将$request 替换为$response,但标题没有改变。 【参考方案1】:

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

<?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-&gt;jsonResponse($data);

专业人士是如何做到的

他们使用 eloquent resources 或者如果还有更多事情发生,fractal 是要走的路(在 Laravel 中使用 spatie 包装器 - https://github.com/spatie/laravel-fractal)。

【讨论】:

好的,但是如何传递 HTTP 状态? 没错!看你想使用错误的工具。我正在更新我的答案。 详细而直截了当。继续@Kyslik 您好,我如何在中间件中传递我的“状态码”?

以上是关于Laravel:用 UTF-8 编码 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

将 Ajax 响应分配给 php 变量

PHP json 编码 - 格式错误的 UTF-8 字符,可能编码不正确

dart系列之:还在为编码解码而烦恼吗?用dart试试

python json.dumps后utf-8编码变成了unicode编码

Laravel 路由上的 Ajax 调用,返回一个包含 ChartJS 标签日期的 json 编码数组

关于Laravel中使用response()方法调用json()返回数据unicode编码转换的问题解决