HttpClient {StatusCode: 415, ReasonPhrase: «Неподдерживаемый тип носителя» - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь вызвать мой API в методе, но получаю ошибку: {StatusCode: 415, ReasonPhrase: 'Unsupported Media Type'.Я осмотрелся и обнаружил, что у многих людей была такая же проблема, но она была решена путем добавления типа носителя при создании StringContent.Я установил содержимое строки и все еще получаю ошибку.

Вот мой метод, в котором я пытаюсь вызвать API:

    [HttpGet]
    public async Task<ActionResult> TimeBooked(DateTime date, int startTime, int endTime, int id)
    {

        var bookingTable = new BookingTableEntity
        {
            BookingSystemId = id,
            Date = date,
            StartTime = startTime,
            EndTime = endTime
        };

        await Task.Run(() => AddBooking(bookingTable));

        var url = "http://localhost:60295/api/getsuggestions/";

        using (var client = new HttpClient())
        {
            var content = new StringContent(JsonConvert.SerializeObject(bookingTable), Encoding.UTF8, "application/json");
            var response = await client.GetAsync(string.Format(url, content));
            string result = await response.Content.ReadAsStringAsync();

            var timeBookedModel = JsonConvert.DeserializeObject<TimeBookedModel>(result);

            if (response.IsSuccessStatusCode)
            {
                return View(timeBookedModel);
            }
        }

И мой метод API:

    [HttpGet]
    [Route ("api/getsuggestions/")]
    public async Task<IHttpActionResult> GetSuggestions(BookingTableEntity bookingTable)
    {
        //code
    }

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

Вот пример, где я использую в основном один и тот же код, и он работает.

[HttpGet]
    public async Task<ActionResult> ChoosenCity(string city)
    {
        try
        {
            if (ModelState.IsValid)
            {
                var url = "http://localhost:60295/api/getbookingsystemsfromcity/" + city;

                using (var client = new HttpClient())
                {
                    var content = new StringContent(JsonConvert.SerializeObject(city), Encoding.UTF8, "application/json");
                    var response = await client.GetAsync(string.Format(url, content));
                    string result = await response.Content.ReadAsStringAsync();

                    var bookingSystems = JsonConvert.DeserializeObject<List<BookingSystemEntity>>(result);
                    var sortedList = await SortListByServiceType(bookingSystems);

                    if (response.IsSuccessStatusCode)
                    {
                        return View(sortedList);
                    }
                }
            }
        }

        catch (Exception ex)
        {
            throw ex;
        }

        return RedirectToAction("AllServices");
    }

И API:

[HttpGet]
    [Route("api/getbookingsystemsfromcity/{city}")]
    public async Task<IHttpActionResult> GetBookingSystemsFromCity(string city)
    {
        //code
    }

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Web API ожидает, что клиент укажет заголовок Content-Type, но вы не можете указать этот заголовок для HttpClient при выполнении запроса GET, поскольку он не имеет тела.Даже если вы указали application/json в StringContent, вы неправильно передали объект в запрос.Рассмотрите возможность использования POST для решения вашей проблемы и общепринятую практику использования POST для передачи сложных объектов.

Обновите API для принятия POST

[HttpPost]
[Route ("api/getsuggestions/")]
public async Task<IHttpActionResult> GetSuggestions(BookingTableEntity bookingTable)

Обновите код запроса

var content = new StringContent(JsonConvert.SerializeObject(city), Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
string result = await response.Content.ReadAsStringAsync();

Примечание

Не распоряжайтесь HttpClient при каждом запросе, он предназначен для повторного использования .

1 голос
/ 02 апреля 2019

Вы отправляете тело в запросе get, у которого нет параметра body. Вы можете передавать параметры только в URL или в строке запроса.

Второй запрос выполнен успешно, поскольку вы передали город в URL.

Вам нужно будет переключить первый запрос на пост-запрос, если вы хотите передать сложный объект в теле запроса, или разделить сложный объект на параметры и вместо этого передать их в URL-адресе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...