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
相关产品推荐
相关产品推荐

