我想理解为什么FromBody对于普通请求的行为如此。
控制器
public void Post([FromBody]string value)
{
}
POSTMAN请求
问题 在这种情况下,value是我的post方法不会绑定到要测试的value参数。
模型
public class Test
{
public string value { get; set; }
}
控制器
public void Post([FromBody]Test model)
{
}
POSTMAN请求 与案例1相同
结果: 现在模型值属性成功绑定到" test"。
为什么它的表现如此?
答案 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接受正文中的文本/纯文本数据:
默认的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)
。"Hello, world."
( 引号,否则它不会是有效的JSON)。点击Send
后,它现在可以正常工作。
答案 2 :(得分:0)
对于JSON,您可以这样做:
public HttpResponseMessage Webhook(JToken json)
{
}
JToken
为Newtonsoft.Json.Linq.JToken
。
JObject
有效