ASP.NET web api无法获得application / x-www-form-urlencoded HTTP POST

我是web-api的新手。 我想使用web-api接收HTTP POST数据。 内容类型是application/x-www-form-urlencoded ,请求正文如下:

data={"mac":"0004ED123456","model":"SG6200NXL"} (JSON格式)。

我的控制器是这样的:

 public void Post([FromBody]string formData) { data.Add(formData); } 

但是formData始终为null。 仅当我将请求正文更改为:

={"mac":"0004ED123456","model":"SG6200NXL"}

我可以找到{"mac":"0004ED123456","model":"SG6200NXL"}保存在我的formData字符串中。

所以我的问题是我应该如何接收格式的数据:

data={"mac":"0004ED123456","model":"SG6200NXL"}

有没有一种简单的方法可以将JSON淡化为C#?

感谢帮助!

更新:我试图使用模型,但它仍然不适合我。 我的模型是:

 public class Device { public string mac { get; set; } public string model { get; set; } } 

我的HTTP POST请求是:

标题:

 User-Agent: Fiddler Content-type: application/x-www-form-urlencoded Host: localhost:52154 Content-Length: 46 

身体:

 data={"mac":"0004ED123456","model":"SG6200NX"} 

据我所知,我必须使用Content-type: application/x-www-form-urlencoded ,因为HTTP POST是由路由器发送的。 我的工作是收到数据。

引自这里 :

默认情况下,Web API尝试从请求URI中获取简单类型。 FromBody属性告诉Web API从请求主体读取值。

Web API最多只读取一次响应主体,因此只有一个操作参数可以来自请求主体。 如果需要从请求主体获取多个值,请定义复杂类型。

其次,客户端需要使用以下格式发送值:

=价值

具体而言,对于简单类型,名称/值对的名称部分必须为空。

因此,如果要以data=string格式发布数据,则必须创建复杂类型。

 public class MyFormData { public string Data { get; set; } } 

并像这样更新您的控制器:

 public void Post(MyFormData formData) { //your JSON string will be in formData.Data } 

当然,您的其他选择是将内容类型更改为JSON,但实际上取决于您的要求。

这篇文章很老了,但我在寻找答案时偶然发现了它。 我将发布如何让我的工作,也许有人会觉得它很有用。

这是请求:

 POST /api/values HTTP/1.1 Host: localhost:62798 Accept: text/json Content-Type: application/x-www-form-urlencoded Cache-Control: no-cache Postman-Token: 51ee1c5f-acbb-335b-35d9-d2b8e62abc74 UID=200&EMAIL=john%40jones.com&FIRST_NAME=John&LAST_NAME=jones&PHONE=433-394-3324&CITY=Seattle&STATE_CODE=WA&ZIP=98105 

这是模型:

 public class SampleModel{ public string UID { get; set; } public string Email { get; set; } public string First_Name { get; set; } public string Last_Name { get; set; } public string Phone { get; set; } public string City { get; set; } public string State_Code { get; set; } public string Zip { get; set; } } 

这里是POST方法,自动(FromBody)将urlencoded值转换为模型。

 public HttpResponseMessage Post([FromBody] SampleModel value){ 

我能够挑出任何价值,即

  SearchCity(value.City); SearchName(value.Last_Name); 

您应该创建数据的对象,如:

 public class Device { public string mac {get;set;} public string model {get;set;} } 

然后像这样改变你的控制器的动作方法,并将你的对象从consume传递给这个方法

 public void Post(Device deviceData) { // You can extract data like deviceData.mac, deviceData.model etc data.Add(deviceData); } 

您可以使用流行的库json.net之一来对C#中的json对象进行序列化/反序列化

创建一个模型

 public class MyClass { public string mac { get; set; } public string model { get; set; } } 

并使用.net JavaScriptSerializer()。反序列化

 public void Post([FromBody]string formData){ MyClass obj = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize(formData); //get mac and model by obj.mac obj.model } 

欢呼:)

如果您使用的是Content-type:application / x-www-form-urlencoded,则不能指望收到JSON。

我猜你正在使用表格将数据发送到Web Api控制器?

首先,您必须将Content-type更改为application / json ,然后您必须确保在请求正文中发送JSON数据。 如果您通过表单发送数据,则可以使用javascript从表单数据中创建JSON对象。

要在C#中反序列化JSON,我推荐使用Json.NET:http://json.codeplex.com/