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

方式 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'
]);
相关推荐
IT_陈寒5 小时前
SpringBoot实战技巧总结
前端·人工智能·后端
TeamDev5 小时前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
量化分析码农5 小时前
【Python量化多因子实战 05】因子也会轮动:因子动量与因子反转的择时应用
后端
陈随易6 小时前
Rolldown 把插件改动回传提速 26 倍
前端·后端·程序员
金銀銅鐵14 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
陈随易15 小时前
Vue 编译器换掉 source map,快了三四成
前端·后端·程序员
txxzjmzlh16 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端
nice_lcj52018 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
IT_陈寒19 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘
前端·人工智能·后端
系统集成-鹰翔19 小时前
ERP图片改名后仍命中识别缓存:缓存键、十分钟到期与调用计数
javascript·经验分享·后端