Xamarin向PHP服务器POST数据接收失败问题求助
问题分析与解决方案
你遇到的核心问题是:客户端发送的是JSON格式的POST请求体,但PHP的$_POST/filter_input_array(INPUT_POST)只能解析表单编码(application/x-www-form-urlencoded)或多部分表单(multipart/form-data)的数据,JSON格式的请求体不会被自动解析到$_POST中,所以才会出现var_dump($_POST)输出空数组的情况。
下面给你两种可行的解决方案,你可以根据自己的需求选择:
方案一:修改服务端代码,读取并解析JSON数据
既然客户端已经发送了JSON格式的数据,我们可以直接从PHP的原始输入流php://input中读取请求体,再解析成PHP数组使用。
修改后的服务端代码示例:
// 读取原始JSON请求内容 $rawJson = file_get_contents('php://input'); // 将JSON解析为关联数组(第二个参数true表示返回数组而非对象) $requestData = json_decode($rawJson, true); // 安全地获取并过滤数据(避免未定义索引报错) $Id = isset($requestData['Id']) ? filter_var($requestData['Id'], FILTER_SANITIZE_STRING) : null; $Referencia = isset($requestData['Referencia']) ? filter_var($requestData['Referencia'], FILTER_VALIDATE_INT) : null; $Nom_Pieza = isset($requestData['Nom_Pieza']) ? filter_var($requestData['Nom_Pieza'], FILTER_VALIDATE_INT) : null; $Cantidad = isset($requestData['Cantidad']) ? filter_var($requestData['Cantidad'], FILTER_VALIDATE_INT) : null; $Precio = isset($requestData['Precio']) ? filter_var($requestData['Precio'], FILTER_VALIDATE_FLOAT) : null; $Importe = isset($requestData['Importe']) ? filter_var($requestData['Importe'], FILTER_VALIDATE_FLOAT) : null; // 测试输出解析后的数据 var_dump($requestData);
额外建议:可以在服务端先校验请求的Content-Type,确保是合法的JSON请求:
if (strtolower($_SERVER['CONTENT_TYPE']) !== 'application/json') { http_response_code(400); echo json_encode(['error' => '请求格式错误,需要application/json类型']); exit; }
方案二:修改客户端代码,发送表单编码的数据
如果服务端更适合处理传统的表单数据,你可以把客户端的请求格式改成application/x-www-form-urlencoded,这样PHP会自动把数据解析到$_POST中,你的原有服务端代码只需要小调整就能用。
修改后的客户端代码示例:
// 构建表单键值对(注意数值类型要转成字符串) var formData = new Dictionary<string, string> { {"Id", "eee"}, {"Referencia", "0"}, {"Nom_Pieza", "23"}, {"Cantidad", "4"}, {"Precio", "2.6"}, {"Importe", "1.1"} }; private string URL = "http://10.3.148.92/WebServiceXamarin/index.php"; HttpClient client = new HttpClient(); // 使用FormUrlEncodedContent发送表单数据,自动设置正确的Content-Type var content = new FormUrlEncodedContent(formData); var response = await client.PostAsync(URL, content); var contentString = await response.Content.ReadAsStringAsync();
对应的服务端代码可以简化为(直接用filter_input而非filter_input_array,更适合单个字段):
$Id = filter_input(INPUT_POST, "Id", FILTER_SANITIZE_STRING); $Referencia = filter_input(INPUT_POST, "Referencia", FILTER_VALIDATE_INT); $Nom_Pieza = filter_input(INPUT_POST, "Nom_Pieza", FILTER_VALIDATE_INT); $Cantidad = filter_input(INPUT_POST, "Cantidad", FILTER_VALIDATE_INT); $Precio = filter_input(INPUT_POST, "Precio", FILTER_VALIDATE_FLOAT); $Importe = filter_input(INPUT_POST, "Importe", FILTER_VALIDATE_FLOAT); var_dump($_POST); // 现在就能看到数据了
内容的提问来源于stack exchange,提问作者Xim Bravo Jordana
相关产品推荐
相关产品推荐

