Невозможно вызвать метод API Post, у которого есть параметр класса с атрибутом [FromBody] в mvc ядра asp.net. - PullRequest
0 голосов
/ 13 сентября 2018

Я занимаюсь разработкой API в mvc asp.net core для онлайн-бронирования. Но когда я пытаюсь добавить резервирование из метода публикации API, я получаю сообщение об ошибке:

WebException: удаленный сервер возвратил ошибку: (415) Unsupported Тип носителя. System.Net.HttpWebRequest.GetResponse ()

Есть 2 проекта:

Проект 1

В моем методе действия API есть метод post с атрибутом [FromBody]. Я должен вызвать этот метод и передать объект бронирования.

Определение метода:

[HttpPost]
public Reservation Post([FromBody] Reservation res) =>
repository.AddReservation(new Reservation
{
    Name = res.Name,
    FromLocation = res.FromLocation,
    ToLocation = res.ToLocation
});

Проект 2 В проекте 2 я хочу вызвать этот метод API. Для этого я создал форму в виде, чтобы заполнить имя, от местоположения и до значений местоположения. Затем на контроллере я должен вызвать метод API (приведенный выше).

Код контроллера:

[HttpPost]
public IActionResult AddReservation(Reservation reservation)
{
    HttpWebRequest apiRequest = WebRequest.Create("http://localhost:8888/api/Reservation") as HttpWebRequest;
        apiRequest.Method = "Post";
        string parameters = "Name=" + reservation.Name + "Image=" + reservation.Image + "&FromLocation=" + reservation.FromLocation + "&ToLocation=" + reservation.ToLocation;
        byte[] byteArray = Encoding.UTF8.GetBytes(parameters);
        apiRequest.ContentType = "application/x-www-form-urlencoded";
        apiRequest.ContentLength = byteArray.Length;
        // Add the post data to the web request
        Stream postStream = apiRequest.GetRequestStream();
        postStream.Write(byteArray, 0, byteArray.Length);
        postStream.Close();

        string apiResponse = "";
        using (HttpWebResponse response = apiRequest.GetResponse() as HttpWebResponse)
        {
            StreamReader reader = new StreamReader(response.GetResponseStream());
            apiResponse = reader.ReadToEnd();
        }
        return RedirectToAction("Index");
}

Я получаю ошибку - WebException: удаленный сервер возвратил ошибку: (415) Unsupported Media Type. System.Net.HttpWebRequest.GetResponse ()

Но когда я запускаю команду powershell, она работает:

PM> Invoke-RestMethod http://localhost:8888/api/Reservation -Method POST -Body (@{Name="Anne"; ToLocation="Meeting Room 4"} | ConvertTo-Json) -ContentType "application/json"

Пожалуйста, помогите?

Ответы [ 2 ]

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

В вашем POST-коде есть две проблемы, первую из которых я упомянул в комментариях и Крис в своем ответе.

Второй - как вы генерируете тело вашего запроса, используйте что-то вроде этого:

var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
    string json = "{\"user\":\"test\"," +
                  "\"password\":\"bla\"}";

    streamWriter.Write(json);
    streamWriter.Flush();
    streamWriter.Close();
}

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
    var result = streamReader.ReadToEnd();
}

код, полученный из этого anwser

Также вы можете использовать Json.Net для сериализации бронирования (если имена и типы всех полей совпадают)

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

В первом случае вы кодируете тело запроса как x-www-form-urlencoded, а во втором - application/json.Одно и то же действие не может отвечать обоим.Поскольку параметр украшен [FromBody], application/json - это тот, который вы должны использовать, поэтому команда powershell сработала.

Если вы на самом деле хотите x-www-form-urlencoded, тоудалите атрибут [FromBody].Если вам действительно нужно поддерживать оба, вам понадобятся два отдельных маршрута:

private Reservation PostCore(Reservation res)
{
    // do something
}

[HttpPost("json")]
public Reservation PostJson([FromBody] Reservation res) => PostCore(res);

[HttpPost("")]
public Reservation PostForm(Reservation res) => PostCore(res);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...