Подтвердить что ты не робот

ASP.NET web api не может получить приложение /x -www-form-urlencoded HTTP POST

Я новичок в web-api. Я хочу получить HTTP POST-данные, используя web-api. Тип содержимого - 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 на С#?

Спасибо за помощь!

UPDATE: Я пытался использовать модель, но она по-прежнему не работает для меня. Моя модель:

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 отправляется маршрутизатором. Моя задача - получить данные.

4b9b3361

Ответ 1

Цитата из здесь:

По умолчанию 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, но на самом деле зависит от ваших требований.

Ответ 2

Этот пост старый, но я наткнулся на него, ища ответ. Я опубликую, как я получил свою работу, может быть, кто-то найдет ее полезной.

Здесь запрос:

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

Ответ 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 для сериализации/десериализации json-объекта в С#

Ответ 4

создать модель

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

и используйте .net JavaScriptSerializer(). Deserialize

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
}

cheers:)

Ответ 5

Если вы используете Content-type: application/x-www-form-urlencoded, вы не можете ожидать получения JSON.

Я предполагаю, что вы используете форму для отправки данных в контроллер Web Api?

Сначала вы должны изменить Content-type на приложение /json , а затем вы должны убедиться, что вы отправляете данные JSON в свой орган запроса. Если вы отправляете данные через форму, вы можете использовать javascript для создания JSON-объекта из ваших данных формы.

Чтобы десериализовать JSON в С#, я рекомендую Json.NET: http://json.codeplex.com/

Ответ 6

Действительно документация ужасна и все примеры старые. Поток не читается. Это для Dotnet 4.0 для других может быть разным

public JsonResult Index(WebhookEvent event)
{
    // event has all the data 
    return Json(new { success = true });
}