为什么FromBody表现得像这样?

时间:2015-03-12 02:20:06

标签: asp.net-web-api asp.net-web-api2

我想理解为什么FromBody对于普通请求的行为如此。

案例1:

控制器

public void Post([FromBody]string value)
        {
        }

POSTMAN请求 enter image description here

问题 在这种情况下,value是我的post方法不会绑定到要测试的value参数。

案例2:

模型

public class Test
    {
        public string value { get; set; }
    }

控制器

public void Post([FromBody]Test model)
        {
        }

POSTMAN请求 与案例1相同

结果: 现在模型值属性成功绑定到" test"。

为什么它的表现如此?

3 个答案:

答案 0 :(得分:0)

因为这就是API的设计方式。请注意,在您的第二个示例中,您可能已经省略了[FromBody]并且WebApi会搜索正文以查找数据,因为Test是一种复杂类型。

本文解释了WebApi绑定数据的规则:

http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

编辑:如上所述,上面链接的文章明确指出您应该能够做到

void Get([FromBody]string value)

为true,但这意味着您可以将正文的值作为纯文本读入参数值。这意味着如果你走这条路线,你必须使用raw选项(来自postman)并清除Content-Type或确保它设置为text / plain。

换句话说,在Postman上,如果你将send方法设置为raw,并输入"这是一个句子"在提供的文本区域中,当下面的问题得到解决时,您的值将是"这是一个句子"。

现在,如果您尝试从新模板执行此操作,则会遇到此错误:

{
    "Message": "The request entity's media type 'text/plain' is not supported for this resource.",
    "ExceptionMessage": "No MediaTypeFormatter is available to read an object of type 'String' from content with media type 'text/plain'.",
    "ExceptionType": "System.Net.Http.UnsupportedMediaTypeException",
    "StackTrace": "   at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)"
}

本文介绍如何允许WebApi接受正文中的文本/纯文本数据:

https://myadventuresincoding.wordpress.com/2012/06/19/c-supporting-textplain-in-an-mvc-4-rc-web-api-application/

默认的ValuesController使用该签名公开一个方法,但是没有为text / plain提供MediaTypeFormatter,但是我觉得那个微软适合你。

这是一种愚蠢的行为。

答案 1 :(得分:0)

鉴于此方法:

// POST api/values
[HttpPost]
public void Post([FromBody]string value)
{
    Values.Add(value);
}

必须正确配置邮递员才能使我们的值绑定到其C#string对象...确保在我们的情况下工作的一种方法是向我们的服务器发送JSON请求。请按照以下步骤操作:

  • 确保您已选择POST
  • 确保您输入了相应的网址,即http://localhost:1337/api/values
  • 转到Body,勾选raw
  • 的选项
  • 在右侧的下拉列表中,选择JSON (application/json)
  • 在Postman的文本区域中,只插入"Hello, world." 引号,否则它不会是有效的JSON)。

点击Send后,它现在可以正常工作。

答案 2 :(得分:0)

对于JSON,您可以这样做:

    public HttpResponseMessage Webhook(JToken json)
    {

    }

JTokenNewtonsoft.Json.Linq.JToken

如果数据是实际的JSON对象(不是数组),则

JObject有效