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

Xamarin Refit POST请求仅能通过$_REQUEST获取,无法通过$_POST获取

解决Refit POST请求PHP无法通过$_POST获取参数的问题

嘿,这个问题我之前也碰到过!核心原因是你当前的Refit接口定义会把参数当成URL查询字符串传递,而不是POST表单数据,所以PHP的$_POST拿不到,但$_REQUEST因为包含了查询字符串、POST和Cookie的内容,所以能读到参数。

下面给你两个简单的解决方案:

方案1:用DTO类+表单编码请求

先定义一个承载登录参数的类:

public class LoginRequest
{
    public string Email { get; set; }
    public string Password { get; set; }
}

然后修改你的Refit接口,用[Body]属性指定表单编码方式:

[Post("/logUser.php")]
Task<UserResponse> LogUser([Body(BodySerializationMethod.UrlEncoded)] LoginRequest request);

这样Refit会把参数按照application/x-www-form-urlencoded格式发送,这是PHP的$_POST默认能解析的表单格式,服务器端就能直接通过$_POST['email']和$_POST['password']获取参数了。

方案2:直接用[Field]标记单个参数

如果不想创建DTO类,也可以给每个参数加上[Field]特性,告诉Refit把它们作为POST表单字段发送:

[Post("/logUser.php")]
Task<UserResponse> LogUser([Field] string email, [Field] string password);

这个方式更轻量化,适合参数少的场景,效果和方案1一致,PHP的$_POST就能正常读取参数了。

为什么原来的方式不行?

你原来的接口定义没有指定参数的传递方式,Refit默认会把简单类型的参数(比如string)添加到URL的查询字符串里(也就是类似/logUser.php?email=xxx&password=xxx的形式),这种参数属于GET请求的参数范畴,PHP会把它们放到$_GET里,而$_REQUEST是$_GET、$_POST、$_COOKIE的集合,所以能读到,但$_POST自然是空的。

内容的提问来源于stack exchange,提问作者GreuM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:13:09