方式 1:最常用 → json() 助手函数(自动带上 application/json)
TP6 的 json() 响应默认响应头就是 Content-Type: application/json; charset=utf-8,无需手动设置。
php
<?php
namespace app\controller;
class Test
{
public function index()
{
$data = [
'code' => 200,
'msg' => 'success',
'data' => ['name' => 'test']
];
return json($data);
}
}
方式 2:Response 对象手动设置 header
如果你自己创建响应,可以手动指定 Content-Type
php
use think\Response;
public function index()
{
$data = ['code' => 200];
return Response::create($data)
->header('Content-Type', 'application/json; charset=utf-8');
}
但一般不这么写,直接用
json()更简洁。
方式 3:返回原始字符串(重点!你前面问到的 JSON 字符串坑)
⚠️ 大坑:如果你直接 return json_encode () 字符串,TP 默认返回 text/html!
php
// ❌ 错误!返回头是 text/html
return json_encode(['code'=>200]);
想要原始字符串并且 Content-Type:application/json,必须:
php
// ✅ 正确
return response(json_encode(['code'=>200]))
->header('Content-Type', 'application/json; charset=utf-8');
尽量不要手写
json_encode,优先框架json()方法。
方式 4:全局统一设置(所有接口生效)
中间件全局统一响应头
创建中间件,或者在 app/middleware.php 使用全局响应中间件:
php
<?php
namespace app\middleware;
class JsonHeader
{
public function handle($request, \Closure $next)
{
$response = $next($request);
// 如果是JSON响应,追加header
if ($response instanceof \think\response\Json) {
$response->header('Content-Type','application/json; charset=utf-8');
}
return $response;
}
}
注册为全局中间件。
方式 5:json 响应自定义附加 Header
php
return json([
'code' => 200
])->header([
'Content-Type' => 'application/json; charset=utf-8',
'Token' => 'xxxx'
]);