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

时间:2013-12-04 07:19:06

标签: c# asp.net json asp.net-web-api

我是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是由路由器发送的。我的工作是接收数据。

6 个答案:

答案 0 :(得分:28)

引自here

  

默认情况下,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,但实际上取决于您的要求。

答案 1 :(得分:6)

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

这是请求:

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);

答案 2 :(得分:3)

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

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

然后像这样更改控制器的操作方法,并将对象从使用

传递给此方法
public void Post(Device deviceData)
{
    // You can extract data like deviceData.mac, deviceData.model etc
    data.Add(deviceData);
}

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

答案 3 :(得分:2)

创建模型

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<MyClass>(formData);
    //get mac and model by obj.mac obj.model
}
欢呼:)

答案 4 :(得分:1)

对于asp.net core 3.x,您需要提供正确的装饰器以正确处理请求:

[HttpPost("MyPostHandler")]
[Consumes("application/x-www-form-urlencoded")]
public async Task<IActionResult> MyPostHandler([FromForm] string id)
{
}

答案 5 :(得分:0)

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

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

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

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