Angular Http.post无法向PHP(CodeIgniter)服务器提交数据求助
解决Angular Http.post向CodeIgniter提交数据无法获取的问题
这个问题我之前也碰到过,核心原因是CodeIgniter默认只解析application/x-www-form-urlencoded格式的表单数据,而你尝试的几种写法要么直接传JSON对象,要么设置了Content-Type: application/json,这时候PHP不会自动把JSON请求体填充到$_POST数组里,所以后端打印出来是空的。
下面给你两种可行的解决方案,你可以根据需求选择:
方案一:Angular端发送表单编码格式的数据
这种方式符合CodeIgniter默认的解析规则,不需要修改后端代码。因为你用的是Angular 5(对应CLI 1.7.3)的Http模块,可以用URLSearchParams来构造表单数据:
import { Http, URLSearchParams } from '@angular/http'; // 你的组件类里: private url = 'http://localhost/...../post'; constructor(private http: Http) { } addData() { // 构造表单参数 const params = new URLSearchParams(); params.set('name', 'MyName'); this.http.post(this.url, params) .subscribe(response => { console.log(response.text()); }); }
这时候后端的$_POST就能正常获取到数据了,你也可以用CodeIgniter的官方方法$this->input->post('name')来读取,更安全。
方案二:后端CodeIgniter读取JSON请求体
如果你想坚持用JSON格式传输数据,只需要修改后端代码,手动读取并解析请求体里的JSON内容:
public function post() { echo 'backend working.. '; // 读取原始JSON请求体 $rawJson = file_get_contents('php://input'); // 解析为关联数组 $postData = json_decode($rawJson, true); // 如果解析失败,返回空数组 if ($postData === null) { $postData = []; } print_r($postData); }
这样不管前端用哪种JSON方式发送,后端都能拿到正确的数据。如果多个接口都需要处理JSON请求,建议把解析逻辑封装成基类方法,方便复用:
// 在你的基础控制器里添加 protected function getJsonPostData() { $rawJson = file_get_contents('php://input'); return json_decode($rawJson, true) ?: []; } // 然后在post方法里调用 public function post() { echo 'backend working.. '; $postData = $this->getJsonPostData(); print_r($postData); }
额外注意:跨域问题
如果你的Angular项目和CodeIgniter不在同一个端口(比如Angular用4200,CodeIgniter用80),可能会碰到跨域问题。这时候需要在CodeIgniter的控制器里添加CORS响应头:
public function post() { // 处理OPTIONS预检请求 if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: POST, GET, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type"); exit; } // 允许跨域 header("Access-Control-Allow-Origin: *"); // 后续的业务逻辑 echo 'backend working.. '; $rawJson = file_get_contents('php://input'); $postData = json_decode($rawJson, true) ?: []; print_r($postData); }
这样就能解决跨域导致的请求失败问题了。
内容的提问来源于stack exchange,提问作者reshanpubudu
相关产品推荐
相关产品推荐

