json - 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
标题,我无法覆盖它。
我应该怎么做?
谢谢您的帮助。
解决方案
它就在文档中,您想在中间件之后使用(以下代码来自我的脑海,它应该可以工作):
<?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)。
推荐阅读
- pyspark - 如何纠正model.json的列多于输出的CSV文件
- sas - SAS 在小数点末尾删除一个数字
- javascript - Docker 中的 Express Typescript 应用程序构建问题
- sql - 获取SQL中同一列中2个日期之间的天数
- bash - 在从 bash 中读取文件时循环运行 curl commads
- api - 服务器端上的 Nuxt.js api resquest 返回错误 net::ERR_NAME_NOT_RESOLVED
- c - 为什么我的计算器在乘法和除法时总是给我0,而加法和减法工作正常?
- python - Matplotlib 可视化总是崩溃
- python - 我怎样才能用漂亮的汤从这个网页上刮下这个符号?
- laravel - 如何在 laravel 控制器上触发 http url