Android发送请求成功但PHP无法接收POST数据问题咨询
为什么Android POST请求返回200,但PHP的$_POST是空数组?
这个问题我之前帮同事排查过好多次,看似奇怪其实都是常见的细节问题,咱们一个个来拆解:
1. 请求头Content-Type不匹配
这是最常见的原因!PHP对$_POST的解析完全依赖请求头类型:
- 如果你是普通表单提交,必须把请求头设为
application/x-www-form-urlencoded,同时请求体是key1=value1&key2=value2的键值对格式,PHP才会自动把数据解析到$_POST里。 - 如果你在Android里发送的是JSON数据,请求头一般是
application/json,这时候PHP默认不会把JSON数据放到$_POST里,你得手动读取原始请求体再解析:$jsonRaw = file_get_contents('php://input'); $postData = json_decode($jsonRaw, true);
2. Android端请求体格式错误
就算你设对了application/x-www-form-urlencoded,如果请求体不是标准的键值对格式,PHP也解析不了。比如:
- 直接传了纯文本或未编码的JSON字符串
- 键值对里的特殊字符(空格、&、=等)没做URL编码
建议用Android自带的UrlEncodedFormEntity或者OkHttp的FormBody来构建请求体,它们会自动帮你处理编码和格式问题。
3. 不小心用了GET请求
虽然你说的是POST请求,但有时候代码里会写错——比如OkHttp里调用了get()而非post(),或者HttpURLConnection的setRequestMethod设成了GET。这时候请求确实能到服务器(返回200),但数据是放在URL参数里的,PHP只会把它放到$_GET里,$_POST自然是空的,赶紧检查下Android代码里的请求方法!
4. PHP配置或服务器限制
这种情况比较少见,但也不能忽略:
php.ini里的post_max_size设置太小,导致POST数据被截断,PHP无法解析max_input_vars设置得不够,无法容纳你提交的所有键值对- 服务器的rewrite规则(比如Apache/Nginx的.htaccess配置)把POST请求转成了GET,导致数据丢失
你可以查看PHP的错误日志,或者临时在代码里打印phpinfo()来检查这些配置。
快速排查步骤
- 用抓包工具(比如Charles、Fiddler)确认Android发送的请求:请求方法是POST、Content-Type正确、请求体格式符合要求
- 根据请求类型调整PHP的读取方式(表单用
$_POST,JSON用php://input) - 排查PHP配置和服务器rewrite规则
内容的提问来源于stack exchange,提问作者Xw Kang
相关产品推荐
相关产品推荐

