codeigniter 3 和 4 的 json 响应机制完全不同:ci3 必须用 $this->output->set_content_type()->set_output() 手动输出,ci4 必须用 service('response')->setjson();顺序、编码、空格、对象转换等细节均需严格遵循版本规范。

CodeIgniter 3 和 CodeIgniter 4 的 JSON 响应机制完全不同,直接混用会导致空白页、500 错误或前端解析失败。别套用 Laravel 或 ThinkPHP 的写法,得按版本走。
CodeIgniter 3 中 set_output + set_content_type 是最稳的组合
CI3 没有原生 json() 方法,$this->output->set_output() 是唯一可控的输出入口。手动设头 + 手动编码是标准路径,任何绕过 Output 类的 echo / header() 都可能被后续钩子覆盖或触发缓存冲突。
-
set_content_type('application/json')必须在set_output()前调用,顺序反了头信息就丢了 - 务必用
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),否则中文变\u4f60\u597d,斜杠被转义成\/ - 控制器方法末尾不能有额外
echo、print_r或空行,否则 JSON 前会多出空白字符,前端JSON.parse()直接报Unexpected token - 如果用了
MY_Controller基类,确保基类没在构造函数里提前调用$this->output->set_output()
示例:
public function get_user()
{
$user = ['id' => 1, 'name' => '张三', 'email' => 'zhang@example.com'];
$this->output
->set_content_type('application/json', 'utf-8')
->set_output(json_encode($user, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
}
CodeIgniter 4 必须用 service('response')->setJson()
CI4 彻底弃用 $this->output,所有响应必须走 Response 实例。直接 echo json_encode() 不仅不生效,还会破坏 PSR-7 响应生命周期,导致中间件失效或 CORS 头丢失。
- 获取响应对象只能通过
service('response'),不能 new 实例 -
setJson()会自动设置Content-Type: application/json和charset=utf-8,无需手动设头 - 若需自定义状态码,链式调用
setStatusCode(201),不要用http_response_code() - 模型返回的对象数组(如
Result)需先用getResultArray()或getFirstRow('array')转成 PHP 数组,否则json_encode会失败
示例:
public function show($id)
{
$user = $this->userModel->find($id);
if (!$user) {
return service('response')->setStatusCode(404)->setJson(['error' => 'not found']);
}
return service('response')->setJson(['data' => $user]);
}
统一封装响应结构时,别在控制器里拼数组
常见错误是每个接口都写一遍 ['code' => 0, 'msg' => 'ok', 'data' => $xxx],既重复又难维护。CI3 可在基类加 api_response() 方法,CI4 则推荐用 ResponseTrait + 自定义服务。
- CI3 基类中避免用
$this->load->view(),那会走模板引擎,和 JSON 冲突 - CI4 中若继承了
BaseController并 useResponseTrait,优先用$this->respond()而非service('response'),更简洁 - 所有封装方法最终仍要落到
set_output()(CI3)或setJson()(CI4),中间层只是语法糖,不是魔法 - 时间戳字段(如
created_at)若来自数据库,CI4 的Time对象默认转 JSON 会出错,必须显式调用toDateTimeString()或getTimestamp()
最易忽略的是编码一致性:CI3 的 autoload.php 里没加载 url 辅助函数,base_url() 就会报错;CI4 的 .env 里 app.charset 若不是 UTF-8,JSON_UNESCAPED_UNICODE 就无效。这些细节不检查,JSON 看似返回了,实际是乱码或截断。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










