Как получить несколько объектов JSON и параметр Uri в контроллере WebAPI - PullRequest
0 голосов
/ 07 сентября 2018

Я столкнулся со следующим сценарием при испытании ASP.NET Web API2. У меня есть контроллер WebAPI2:

[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri]  string date, [FromBody List<car> cars)

}

Теперь я могу вызвать это с помощью следующего jQuery:

<script>
    var carsData = [{ "model": "Audi" }, { "model": "BMW" }, { "model": "Audi" }];

    var uri = 'api/service/receiver/20180107';

    $.ajax({
        type: "POST",
        url: uri,
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(carsData),
        dataType: "json",
        success: function (data) {
            alert(data);
        },
        failure: function (errMsg) {
            alert(errMsg);
        }
    });
</script>

Это прекрасно работает, но я понятия не имею, как разместить несколько сложных объектов или, может быть, сложный объект JSON и несколько дополнительных параметров.

Я пытался:

[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri]  string date, [FromBody List<car> cars, [FromBody] List<company> companies)

}

, а также

[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri]  string date, [FromBody List<car> cars, string company)

}

и затем в вызове jQuery я изменил data строку

data: JSON.stringify({ cars: carsData, companies: compData }),

, а также

data: JSON.stringify({ cars: carsData, company: "theCompany" }),

Но тогда я получаю 404 или ноль. Как это можно сделать?

1 Ответ

0 голосов
/ 08 сентября 2018

Прежде всего, «FromBody» относится к из тела HTTP-запроса . По сути, тело полученного запроса берется и преобразуется в объект (по умолчанию десериализация JSON). MVC.NET возьмет все тело и сделает объект. Вот почему у вас не может быть двух [FromBody].

Исходя из вашего jQuery, вы пытаетесь передать { cars: carsData, companies: compData } и { cars: carsData, company: "theCompany" } оба объекта целиком, отправленные как тело. Каждый из этих объектов имеет два свойства (cars и companies) и (cars и company) соответственно. Поскольку вы передаете их как целые объекты в тело, MVC также необходимо десериализовать тело в целую строку.

Вам нужно будет создать новый класс:

class MyCarData {
    public List<car> cars { get; set; }
    public List<company> companies { get; set; }
}

Затем вы можете использовать [FromBody] MyCarData в вашем контроллере для доступа к нему в целом.

...