【问题标题】:How to pass the entire body of a HTTP Post as a single string to WebAPI如何将 HTTP Post 的整个正文作为单个字符串传递给 WebAPI
【发布时间】:2013-06-25 10:33:25
【问题描述】:

我有一个“查找”WebAPI 服务,它返回查找表数据,例如称呼(Mr Mrs 等)和一些更长的数据(例如业务类型)。

为了省去手动填充查找表的麻烦,我添加了一个 HttpPost 方法,假设我可以使用 Fiddler2 在正文中简单地传递 行分隔 数据集。这样我就可以将数据列表粘贴到 fiddler 并在几秒钟内添加我所有的查找:

    // post api/lookup/lookupName
    [HttpPost]
    public void SaveNewLookups([FromUri(Name="id")] string lookupName, [FromBody]string body)

但是现在无论我尝试了什么内容类型,当方法被命中时,body 参数总是为 null。

我通过使用以下代码访问原始正文文本解决了这个问题,但让参数化版本工作会很好:

string body = Request.Content.ReadAsStringAsync().Result;

我不想对数据使用 JSON 或其他格式,因为这会破坏使用简单文本列表的目的。

【问题讨论】:

    标签: http-post asp.net-web-api


    【解决方案1】:

    'Content-Type: application/x-www-form-urlencoded' 放入请求标头中,然后将您的字符串内容放入fiddler,前面加上等号(=)。例如:

    =datavalue1
    datavalue2
    

    您应该在控制器中收到您的数据值:

    datavalue1\r\ndatavalue2
    

    【讨论】:

    • 宾果游戏。我曾分别尝试过这两件事,但一定错过了把它们放在一起:) 干杯
    • WebApi 有问题。这种胡思乱想浪费了数小时的时间,然后你必须记住他们想要东西的特殊方式,当你回来并再次记住它时。更糟糕的是,发件人必须参与这种欺骗。这个简单的操作(将愚蠢的正文读入一个简单的字符串!)绝对没有充分的理由需要一个 form-url-encoded 内容类型,或者像 Darrel 的响应中那样,一个特殊的格式化程序。我对即将到来的 MVC 和 WepApi 合并感到兴奋,但我担心它们可能会给 MVC 带来这种讨厌。吓人。
    • 请注意,我正在从 iOS 和 Android 设备接收内容。要使用这些路由中的任一个(Susiak 或 Miller 的),我必须与来自明显不同的应用程序代码库(iOS 和 Android)的所有发件人协调,他们要么 form-url-encode 这样简单正文消息(当它只是一个简单的字符串时!,它不是一个表单),或者,他们设置了文本/纯内容类型的标题(除了我要做的额外工作)。但是,如果使用默认的内容类型(如“text/html”),则没有理由拒绝此消息。没关系,但这种情况并没有提供那种选择。
    【解决方案2】:

    PlainTextFormatter 添加到格式化程序列表并将内容类型设置为text/plain

    【讨论】:

    • 方便的链接,但 Jonny S 的答案有效,不需要特殊代码。谢谢
    • 这是一个很好的解决方案。它就像一个魅力。令人震惊的是,WebApi 没有开箱即用的功能。对于其他人:将他的代码(这个 PlainTextFormatter 类)放在您的解决方案中,然后像这样注册它:config.Formatters.Add(new PlainTextFormatter()); 就是这样。现在它可以工作了(虽然你的字符串参数仍然需要 [FromBody] 装饰):public HttpResponseMessage NewComment(int postId, int orgId, [FromBody] string body) ...
    猜你喜欢
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2016-08-12
    • 2013-03-28
    • 2021-09-25
    • 2019-01-27
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多