CodeIgniter结构响应中JSON输出如何实现_CodeIgniterJSON响应构建【介绍】

2次阅读

codeigniter 3 中需同时设置 header(‘content-type: application/json; charset=utf-8’) 和 json_encode($data, json_unescaped_unicode) 才能正确输出中文;ci4 中必须 return $this->response->setjson($data) 否则无输出,且跨域需手动添加 cors 响应头。

CodeIgniter结构响应中JSON输出如何实现_CodeIgniterJSON响应构建【介绍】

CodeIgniter 3 中 json_encode() 输出中文乱码

直接用 json_encode($data) 输出中文,浏览器看到的是 u4f60u597d 这种 Unicode 转义,不是乱码,但不符合前端直读需求。根本原因是 PHP 原生 json_encode() 默认不处理 UTF-8 多字节字符的编码方式,而 CodeIgniter 3 的默认输出未设响应头。

  • 必须手动加 header('Content-Type: application/json; charset=utf-8'),否则浏览器按 ISO-8859-1 解析
  • json_encode($data, JSON_UNESCAPED_UNICODE) 是关键参数,漏掉就全是 uXXXX
  • 别在控制器里 echo 后再 exit —— CodeIgniter 的输出类可能已缓存或覆盖 header

CodeIgniter 4 的 setJSON() 方法为何返回空白页

调用 $this->response->setJSON($data) 却没输出?大概率是忘了 return $this->response。CI4 的响应对象是“构建后需显式返回”的链式设计,不是自动输出。

  • 必须写 return $this->response->setJSON($data),否则响应体被丢弃
  • 如果之前调用了 $this->output->set_content_type() 或其他输出操作,会干扰 setJSON() 自动设置的 header
  • setJSON() 默认带 JSON_PRETTY_PRINT,调试时好看,上线前建议关掉(加第二个参数 false

CI3 里用 output->set_output() 输出 JSON 的风险

有人图省事在 CI3 控制器里写 $this->output->set_output(json_encode($data)),看似能用,但隐患明显:header 没同步设、字符集没声明、后续钩子可能篡改输出。

  • 它绕过了 output->set_content_type('application/json'),导致前端 fetch() 的 response.json() 报错:Unexpected Token
  • 若开启 output 缓存,set_output() 写入的是原始字符串,不会触发 JSON 相关的自动转义或压缩逻辑
  • 更稳妥的做法是组合使用:$this->output->set_content_type('application/json')->set_output(json_encode($data, JSON_UNESCAPED_UNICODE))

跨域场景下 CI3/CI4 的 JSON 响应要额外加什么

前端报错 No 'access-Control-Allow-Origin' header,说明服务端没回 CORS 头。JSON 响应本身不解决跨域,得靠 header 补全。

  • CI3:在输出前加 header('Access-Control-Allow-Origin: *')(生产环境别用 *,换成具体域名)
  • CI4:用 $this->response->setHeader('Access-Control-Allow-Origin', 'https://your-app.com')
  • 如果前端带 credentials(如 cookie),还得加 Access-Control-Allow-Credentials: true,且 Origin 不能为 *
  • CORS 预检请求(OPTIONS)必须单独响应 200,否则 POST/PUT 的 JSON 请求发不出去

实际项目里最容易被跳过的,是 header 设置顺序和响应对象的 return 动作——尤其在 CI4 中,少一个 return,整个 JSON 就静默消失。

text=ZqhQzanResources