Flutter发送HTTP POST请求后PHP服务端$_POST为空的问题求助
大家好,我最近碰到个棘手的问题,想请各位帮忙看看!我在Flutter应用里写了一段发送POST请求的代码,但是PHP服务端用$_POST获取数据时始终是空数组,可我用Postman测试同样的参数,$_POST里就能正常拿到数据,实在搞不清哪里出问题了,麻烦帮我分析下!
我的Flutter请求代码:
发送请求的函数:
static Future<List<dynamic>?> postData(data) async { var body = json.encode(data); Map<String, String> headers = {"Content-Type": "application/json"}; var url = Uri.http(Config.api, Config.endPoint); var response = await client.post(url, headers: headers, body: body); if (response.statusCode == 201) { var data = jsonDecode(response.body); return data; } return null; }
要发送的数据:
Map data = { 'database': 'school_control_ykt', 'table': 'tablets_helper', 'place': place, 'reason': reason, 'teacher': teacher, 'name': name, 'id_group': id_group }; postData(data);
问题描述
按照上面的代码发送请求后,PHP端的$_POST始终是空的,但用Postman提交相同参数时,$_POST能正常获取到所有数据,这到底是哪里出问题了?
问题原因和解决方案
其实核心问题出在请求的数据格式和PHP的解析逻辑上:
PHP的$_POST默认只会自动解析application/x-www-form-urlencoded(表单键值对)或者multipart/form-data(文件上传类表单)格式的请求体,而你在Flutter里设置了Content-Type: application/json,并且把数据编码成JSON字符串发送,这种格式$_POST是识别不了的。
而你用Postman测试正常,应该是因为你在Postman里选择了表单格式(比如form-data或x-www-form-urlencoded)发送参数,而非JSON格式,所以$_POST能正常解析。
这里有两种解决方案:
方案1:修改Flutter代码,发送表单格式数据
把请求改成发送标准表单格式,这样PHP的$_POST就能直接识别。修改后的Flutter代码:
static Future<List<dynamic>?> postData(data) async { var url = Uri.http(Config.api, Config.endPoint); // 直接传入data,http库会自动将其转换为application/x-www-form-urlencoded格式 var response = await client.post(url, body: data); if (response.statusCode == 201) { var data = jsonDecode(response.body); return data; } return null; }
方案2:修改PHP代码,解析JSON格式请求体
如果不想改动Flutter的请求格式,仍然要发送JSON,那就在PHP端直接读取原始请求体并解析:
// 读取请求的原始内容 $rawRequestBody = file_get_contents('php://input'); // 将JSON字符串解析为关联数组 $requestData = json_decode($rawRequestBody, true); // 之后就可以通过$requestData['database']、$requestData['table']等方式获取参数了
这样不管是Flutter发送的JSON请求,还是Postman以raw JSON格式发送的请求,都能正确获取到数据。
备注:内容来源于stack exchange,提问作者Andres Thomas

