Flutter通过HTTP POST请求PHP接口时php://input无法获取传参
问题原因及解决方案
1. 跨域预检请求拦截导致请求体丢失
你当前PHP侧配置的Access-Control-Allow-Headers响应头未允许Content-Type请求头,而Flutter侧请求携带了Content-Type: application/json的自定义头,会触发HTTP客户端的CORS预检OPTIONS请求:
- 预检请求未通过校验的情况下,正式POST请求的请求体不会发送到后端,直接导致
php://input读取为空。 - 修复方案,修改PHP的跨域头配置:
<?php header('Content-Type: application/json'); header("Access-Control-Allow-Origin: *"); // 新增允许POST和OPTIONS请求 header("Access-Control-Allow-Methods: POST, OPTIONS"); // 新增允许Content-Type头 header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Origin, Accept"); // 新增OPTIONS请求处理逻辑,直接返回200 if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { http_response_code(200); exit(); } // 原有后续业务逻辑不变 include 'connect.php'; // ... 剩余代码
2. 服务器重定向导致请求体丢失
如果请求地址和PHP实际部署地址不完全匹配,会触发301/302重定向,重定向过程中POST请求的请求体默认会被丢弃:
- 检查Flutter侧请求的地址是否和PHP部署地址完全一致:包括http/https协议、是否带www前缀、路径结尾是否多/少斜杠、路径大小写是否匹配。
3. PHP配置异常导致无法读取请求体
检查服务器php.ini配置项:
- 确认
enable_post_data_reading配置为On - 确认
post_max_size配置值大于你实际发送的请求体大小
4. 问题排查验证方法
可以先用Postman等接口测试工具,直接向PHP接口发送JSON格式的POST请求:
- 如果工具请求能正常读取到
php://input内容,说明问题出在Flutter侧请求配置或者CORS跨域配置 - 如果工具请求也读不到内容,说明问题出在PHP侧配置或者服务器部署规则
额外安全优化建议
你当前的PHP代码存在严重安全风险:
- 直接拼接用户输入到SQL语句,存在SQL注入漏洞,建议替换为mysqli预处理绑定参数的写法
- MD5加密密码安全性极低,建议使用PHP自带的
password_hash()加密存储密码,校验时用password_verify()做验证
内容的提问来源于stack exchange,提问作者Rajesh Abdullah
相关产品推荐
相关产品推荐

