我想将我的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
标题,我无法覆盖它。
我该怎么办?
感谢您的帮助。
答案 0 :(得分:4)
它就在文档中,您希望在中间件之后使用(以下代码来自我的头脑,它应该可以工作):
<?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);
}
}
通过上述方法,我们可以发现两种反模式:
将以下代码放入 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);
他们使用eloquent resources或者如果还有更多进展fractal是要走的路(在Laravel中使用spatie包装 - https://github.com/spatie/laravel-fractal)。