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/
- 具有持久性的网页导航 – ASP.NET C#
- 如何在asp.net中的代码中设置Table / TableRow / TabelCell宽度百分比?
- 使用OpenXML SDK w / ASP.NET流式传输内存Word文档导致“损坏”文档
- 例外:DataValidation列表的总长度不能超过255个字符
- 打开xml sdk excel公式重新计算缓存问题
- 在web.config文件中加密和存储密码
- 使用C#/ ASP.NET创建Scaffold代码的最快方法
- 如何使用SqlDataSource选择级联DropDownList
- 在ASP.NET中,如何将DropDownList中的日期格式强制为“DD / MM / YYYY”?