当 HTTP-POST 有 body 时,url 参数为空
Posted
技术标签:
【中文标题】当 HTTP-POST 有 body 时,url 参数为空【英文标题】:When HTTP-POST has body, url parameter is null 【发布时间】:2012-04-01 12:50:49 【问题描述】:这是自托管的 RESTful MVC4 Web API,唯一的路由是api/controller/state
。当我发送具有正文的 HTTP-POST 时,状态参数为空。如果我删除主体,则状态变量存在。
我认为它适用于 HTTP-POST 的方式是映射 url 参数,然后将正文序列化为额外参数,在本例中是数据参数。内容只是我必须编写自定义 MediaTypeFormatter 的字符串数据(我认为它无法处理常规字符串很奇怪)。
这是我的控制器签名
public class MyController : ApiController
public void Post(string state, string data)
以前有没有人见过这种行为,或者可以向我解释为什么存在身体会影响我的 url 参数?
【问题讨论】:
好吧,我可以告诉你,在 MVC3 中它的工作方式和你期望的一样。 当前存在一些问题,当您有一些来自正文和一些来自 url 的参数时。它们正在开发中,并将在 beta 后修复。我相信一种解决方法是使用 [FromUrl] 属性。 【参考方案1】:一种解决方案: 我尝试将数据参数更改为复杂类型(只是一个具有公共属性的类)并将内容作为 text/xml 而不是 text/plain 发送,它按预期工作。 state 参数不为空,并且我的强类型对象包含数据。我想 MVC 希望有一些东西可以反序列化,例如用于 http-request 主体的 XML 或 JSON...
更多研究: 我有机会进行更多测试。如果文章的正文是 XML/JSON,它将首先尝试将正文对象的属性映射到方法参数,如下所示。如果仍然有未映射的属性,则它将剩余的属性与方法参数中任何强类型对象的属性匹配
PostMethod(string p1, string p2, myClass obj) // if myClass has a p3 property it will be mapped from the xml body.
// xml in body of http-post
<Xml>
</p1>
</p2>
</p3>
</Xml>
如果所有参数都没有被映射,那么它会尝试映射 url 参数。将其直接与我最初的问题联系起来。我目前看到的最好和最简单的解决方案是像这样发送 text/xml。
PostMethod(string state, string data)
<data>put data here</data>
Urlencoded 键/值对也很有效。
var r = client.PostAsync(url, new StringContent("data=Something", Encoding.UTF8, "application/x-www-form-urlencoded"));
我最好的猜测是 JSON 和 XML 的键/值特性,FormEncoded 帮助它映射到参数,这就是它不喜欢纯字符串的原因。
这确实让我头疼,我发现 MVC4 文档相当稀缺(它仍处于测试阶段),但我希望这可以帮助可能遇到同样问题的其他人。
【讨论】:
以上是关于当 HTTP-POST 有 body 时,url 参数为空的主要内容,如果未能解决你的问题,请参考以下文章