You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP CodeIgniter API无法接收Angular发送的JSON格式POST数据

CodeIgniter接收Angular JSON请求参数为空的修复方案

问题根因

问题由前后端两处配置/写法错误共同导致:Postman默认发送application/x-www-form-urlencoded表单格式请求,CodeIgniter可自动解析该格式参数到全局请求对象中;而Angular发送JSON格式请求时存在写法错误,且CodeIgniter默认不会自动解析application/json类型的请求体,最终导致后端拿到的所有字段为空,触发数据库非空字段报错。

第一步:修复Angular端请求代码

原Angular代码存在3个明确错误:

  • HttpHeaders为不可变对象,调用append()方法不会修改原实例,仅会返回新的头部对象,原写法实际上没有成功设置任何自定义请求头
  • 请求头名称书写错误:正确的JSON内容类型头名为Content-Type(横杠连接),不是Content Type(空格连接)
  • HttpClient.post默认会自动将传入的JS对象序列化为JSON格式,无需手动调用JSON.stringify(),手动序列化容易引发双重编码问题

修复后的前端代码如下:

onSubmit(){
  // 初始化时直接传入头部配置,避免不可变对象导致的头丢失问题
  const headers = new HttpHeaders({
    "Content-Type": "application/json",
    "Accept": "application/json"
  });
  const postData = {
    account_name : "Test User 2",
    display_name : "Test 2",
    phone_no : "2832532",
    email : "james@gmail.com"
  }

  // 直接传入JS对象即可,无需手动序列化
  this.http.post("http://localhost:8080/api/user-info/create-user", postData, {headers: headers})
  .subscribe({
    next: data => console.log(data),
    error: err => {
      console.log(err);
      console.log(postData)
    }
  })
}

第二步:修复CodeIgniter后端JSON参数解析逻辑

CodeIgniter默认仅会自动解析表单格式(application/x-www-form-urlencoded、multipart/form-data)的请求参数,对于JSON格式的原始请求体,需要手动解析后才能获取参数,两种修复方案二选一即可:

方案1:单接口单独解析

在对应接口方法中直接读取原始请求流解析JSON:

public function create_user() {
  // 读取原始请求体
  $rawInput = file_get_contents('php://input');
  // 解析JSON为关联数组,解析失败时返回空数组
  $requestParams = json_decode($rawInput, true) ?? [];

  // 后续逻辑直接从$requestParams中取参数即可,例如$requestParams['account_name']
  // 原有数据库写入逻辑无需修改
}

方案2:全局自动解析(推荐)

如果项目中大量接口需要接收JSON请求,可以在基类控制器的构造方法中添加全局解析逻辑,兼容原有$this->input->post()的取参方式,不用修改每个接口的代码:

// 基类控制器(例如CI3的MY_Controller、CI4的BaseController)构造方法中添加
public function __construct() {
  parent::__construct();
  // 检测当前请求为JSON格式时,自动解析参数到$_POST全局数组
  $contentType = $_SERVER['CONTENT_TYPE'] ?? '';
  if (str_contains($contentType, 'application/json')) {
    $rawInput = file_get_contents('php://input');
    $_POST = json_decode($rawInput, true) ?? [];
  }
}

注意:若运行环境PHP版本低于8.0,无内置str_contains函数,可将内容类型判断逻辑替换为stripos($contentType, 'application/json') !== false,效果一致。

验证方法

  • 修复后打开浏览器开发者工具,查看网络面板中对应请求的请求头,确认Content-Type值为application/json
  • 查看请求载荷,确认JSON格式为单层结构,无双重转义(即不要出现外层包裹引号、内部斜杠转义的情况)
  • 后端接口先打印解析后的参数数组,确认所有字段正常获取后,再执行数据库写入逻辑

内容的提问来源于stack exchange,提问作者mustaqSHAH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:18:35