ThinkPHP6 设置响应 `Content-Type: application/json`

6 阅读1分钟

方式 1:最常用 → json() 助手函数(自动带上 application/json)

TP6 的 json() 响应默认响应头就是 Content-Type: application/json; charset=utf-8,无需手动设置。

<?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

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!

// ❌ 错误!返回头是 text/html
return json_encode(['code'=>200]);

想要原始字符串并且 Content-Type:application/json,必须:

// ✅ 正确
return response(json_encode(['code'=>200]))
    ->header('Content-Type', 'application/json; charset=utf-8');

尽量不要手写 json_encode,优先框架 json() 方法。

方式 4:全局统一设置(所有接口生效)

中间件全局统一响应头

创建中间件,或者在 app/middleware.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

return json([
    'code' => 200
])->header([
    'Content-Type' => 'application/json; charset=utf-8',
    'Token' => 'xxxx'
]);