You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:27:17