CodeIgniter3使用fetch发送数据到控制器为null如何解决
问题原因
- 错误配置请求头:你使用
FormData传递表单数据,却手动设置Content-Type: application/json,导致PHP无法正确解析请求体,CodeIgniter的$this->input->post()自然读取不到参数。使用FormData时不需要手动设置Content-Type,浏览器会自动生成带边界标识的正确multipart/form-data请求头。 - 多余的
no-cors配置:同域请求不需要开启该模式,开启后反而会限制你对响应内容的读取权限。 - 测试逻辑错误:你点击按钮后发起的是POST请求,但后续
window.open是新开页面以GET方式访问控制器接口,GET请求没有携带任何POST参数,你看到的null是GET请求的返回结果,不是之前POST请求的返回。
修复方案
1. 前端代码修改
删除错误的请求头和no-cors配置,取消无意义的window.open跳转,直接在控制台查看POST请求的返回即可:
let formData = new FormData() formData.append('testing', 'isi testing') const button = document.querySelector('#kirimkecontroller') button.addEventListener('click', () => { fetch("<?= base_url(); ?>welcome/kiriman_dari_fetch", { method: "POST", body: formData, }).then(res => res.json()) .then(data => console.log('接口返回:', data)) .catch(e => console.log('请求失败:', e)); })
2. 控制器代码无需调整
修改前端后原有控制器逻辑即可正常读取参数:
public function kiriman_dari_fetch() { $testing = $this->input->post('testing'); echo json_encode($testing); }
补充:如果你需要传递JSON格式数据
如果你的业务场景需要传JSON而不是表单数据,就不要使用FormData,调整写法如下:
前端代码
fetch("<?= base_url(); ?>welcome/kiriman_dari_fetch", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ testing: 'isi testing' }) })
控制器代码
CodeIgniter3原生不支持解析JSON格式的POST请求,需要手动读取原始请求体解析:
public function kiriman_dari_fetch() { $rawInput = file_get_contents('php://input'); $params = json_decode($rawInput, true); $testing = $params['testing'] ?? null; echo json_encode($testing); }
内容的提问来源于stack exchange,提问作者frsnmk
相关产品推荐
相关产品推荐

