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
相关产品推荐
相关产品推荐

