[英]C# web API POST JSON data using POSTMAN client results in always NULL in FromBody
[英]Trying to PUT string with Postman in local C# web api, always null or fails
将媒体类型更改为x-www-form-urlencoded而不是multipart / form-data。
此外,WebAPI特别关注FromBody参数。 http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/
对你而言,我认为这是相关部分:
- [FromBody]参数必须编码为= value
剩下的最后一个障碍是Web API要求您以特定格式传递[FromBody]参数。 即使我们使用[FromBody]修饰方法的参数之后,这就是我们的值参数在前一个示例中为null的原因。
Web API的模型绑定器不需要大多数客户端和服务器端框架所期望的相当标准的key = value编码,而是希望在POST主体中找到[FromBody]值而根本没有关键名称。 换句话说,它代替key = value,它正在寻找= value。
到目前为止,这部分是将原始类型发送到Web API POST方法中最令人困惑的部分。 一旦你了解它就不会太糟糕,但非常不直观且不可发现。
那是因为没有媒体类型格式化程序可以将原始字符串序列化到您的模型中(使用[FromBody]
属性的路由参数)。
快速而肮脏的解决方法是直接以字符串形式读取请求正文:
[HttpPut]
public async Task<HttpResponseMessage> Put(HttpRequestMessage request)
{
var myCsv = await request.Content.ReadAsStringAsync();
// do stuff with your string
return new HttpResponseMessage(HttpStatusCode.OK);
}
作为替代方案,您可以自己实现自定义媒体类型格式化程序,根据此答案 。
还有一个类似的Q&A 在这里
我发现解决方案#1对我有用,因为我试图PUT包含Key / Value对的JSON。 所以最初我的JSON看起来像这样
{
"subscriber": {
"Id": "2",
"subscriptions":[
{
"Name": "Subscription 1",
"Id": "18",
"IsSubscribed": false
},
{
"Name": "Subscription 2",
"Id": "19",
"IsSubscribed": false
},
{
"Name": "Subscription 3",
"Id": "20",
"IsSubscribed": false
}
]
}
}
但我修改它成为
{
"Id": "2",
"subscriptions":[
{
"Name": "Subscription 1",
"Id": "18",
"IsSubscribed": false
},
{
"Name": "Subscription 2",
"Id": "19",
"IsSubscribed": false
},
{
"Name": "Subscription 3",
"Id": "20",
"IsSubscribed": false
}
]
}
这很有效。 我使用[FromBody]在我的C#web api中识别出Postman的PUT请求
只是为了添加我的位,还有一种解决方案可以将原语传递给POST或PUT方法。 只需将模型指定为JObject
。 ASP.Net核心web api然后将传入的JSON对象(包含字符串等原语)绑定到JObject模型对象中。
您的代码如下所示:
// POST api/CsvParse
[HttpPut]
public void Put([FromBody]JObject value)
{
//access your string data
string data = value[SPECIFY_KEY_HERE];
if (string.IsNullOrEmpty(data))
throw new Exception("Input is null or empty.");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.