当 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 参数为空的主要内容,如果未能解决你的问题,请参考以下文章

与 isPassive 的 HTTP-Post 绑定

使用 libcurl 进行 http-post

HTTP-POST请求

当 href 属性值是 url 编码时,链接不起作用

[Python Study Notes]进程信息(丁丁软件监控进程,http-post)

如何在 Go Web-Server 和 Vue.js 前端之间交换数据? http-post : 404