Angular HTTP POST请求状态码200但PHP端$_POST数组为空,无法创建数据问题
解决Angular POST JSON到PHP时$_POST为空的问题
这问题我之前开发时也踩过坑!核心原因很简单:你用Angular发送的是Content-Type: application/json格式的请求体,但PHP默认只会自动解析application/x-www-form-urlencoded(表单编码)或者multipart/form-data(文件上传)类型的请求,对JSON格式的原始请求体不会主动处理,所以才会出现请求状态码200但$_POST数组为空的情况。
下面给你两种可行的解决方案,按需选择:
方案一:修改PHP端,解析JSON请求体
不用改Angular的代码,直接在PHP里读取原始请求数据并解析成数组:
// 获取请求的原始JSON数据 $rawRequest = file_get_contents('php://input'); // 把JSON字符串解析为关联数组(第二个参数true表示转成数组,不是对象) $postData = json_decode($rawRequest, true); // 之后就可以用$postData代替$_POST来获取数据了 if (isset($postData['tweet']) && isset($postData['username'])) { // 执行存入数据库的逻辑 } else { print_r($postData); // 现在就能看到你发送的JSON数据了 }
这里的php://input是PHP提供的只读流,专门用来获取HTTP请求的原始请求体内容,非常适合处理JSON这类非表单格式的请求。
方案二:修改Angular端,发送表单编码的请求
如果你不想改动PHP的现有逻辑,也可以把Angular的请求改成表单编码格式,让PHP自动填充$_POST数组:
首先需要导入HttpParams:
import { HttpParams } from '@angular/common/http';
然后修改你的postTweet方法:
postTweet(tweet: Tweet): Observable<Tweet> { const url = `${this.apiUrl}/?page=submit&action=add`; // 将Tweet对象转换为表单参数 const formParams = new HttpParams() .set('username', tweet.username) .set('tweet', tweet.tweet); // 设置请求头为表单编码格式 const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded' }) }; // 发送请求时传入参数的字符串形式 return this.http.post<Tweet>(url, formParams.toString(), httpOptions); }
这样发送的请求就和普通表单提交的格式一致了,PHP会自动把数据解析到$_POST里,你的原有判断逻辑就能正常工作。
另外补充一句:请求状态码200是正常的,因为HTTP层面请求已经成功发送并被服务器接收了,只是PHP没解析到你想要的数据而已,这和HTTP状态码本身无关~
内容的提问来源于stack exchange,提问作者Tania
相关产品推荐
相关产品推荐

