Получение ошибки 400 при попытке выполнить POST запрос к конечной точке в C# ASP.NET Core Web API

Вопрос или проблема

У меня есть ApiTester в HomeController, который при загрузке выполняет POST запрос к методу API в AuthController.

Это мой класс ApiTester:

    [HttpGet]
    public async Task<IActionResult> ApiTester()
    {
        // Создаем экземпляр HTTP-клиента
        var client = _httpClientFactory.CreateClient();

        // Отправляем POST-запрос к действию ApiTest в AuthController
        var response = await client.PostAsync("https://localhost:7108/api/auth/apitest", null);

        if (response.IsSuccessStatusCode)
        {
            // Читаем содержимое ответа
            var result = await response.Content.ReadAsStringAsync();
            ViewBag.ApiResponse = result; // Сохранее результат в ViewBag для отображения на представлении
        }
        else
        {
            ViewBag.ApiResponse = "Ошибка: " + response.StatusCode;
        }

        return View(); // Возвращаем представление с ответом
    }

Это конечная точка API в AuthController (где запрос даже не достиг):

[HttpPost("ApiTest")]
public IActionResult ApiTest()
{
    return Ok(new { message = "200: тест успешен!" });
}

Когда я загружаю эту страницу и ставлю точку останова на var client, вот что я получил:

вставьте описание изображения здесь

И в var response я получил это:

вставьте описание изображения здесь

Полное сообщение запроса для var response:

{StatusCode: 400, ReasonPhrase: 'Неверный запрос', Version: 1.1, 
Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{
Date: Tue, 08 Oct 2024 05:55:19 GMT
Server: Kestrel
Transfer-Encoding: chunked
Content-Type: application/problem+json; charset=utf-8
}, Trailing Headers:
{
}}

Я получаю код 400. Что может быть причиной этого?

Я попробовал код, и он работает в моей системе. Проверьте, запрашивает ли ваш метод ApiTest тело запроса где-либо, и проверьте, как ваш httpclient инициализируется в стартапе.
Скриншот работающего кода

Ответ или решение

При получении ошибки 400 (Bad Request) при выполнении POST-запроса к вашему API в ASP.NET Core, возможны несколько причин. Давайте проанализируем ваш код и возможные проблемы.

  1. Отсутствие тела запроса: В вашем методе ApiTester вы отправляете POST-запрос без тела (null). Убедитесь, что метод ApiTest в AuthController, который вы вызываете, не ожидает каких-либо данных в теле запроса. Если ваш метод ожидает, что в теле будет передан JSON или какие-либо параметры, вам необходимо передать их корректно.

    Пример изменения вашего запроса с передачей простого JSON-объекта:

    var jsonContent = new StringContent(JsonConvert.SerializeObject(new { /* ваши параметры */ }), Encoding.UTF8, "application/json");
    var response = await client.PostAsync("https://localhost:7108/api/auth/apitest", jsonContent);

    Обязательно импортируйте нужные пространства имен, если вы используете JsonConvert.

  2. Корректность маршрута: Убедитесь, что ваш маршрут API правильно настроен и доступен. В вашем случае маршрут определён как api/auth/apitest. Проверьте, что ваше действие действительно доступно по этому маршруту и что контроллер правильно настроен.

  3. Настройки CORS: Если API и фронтенд работают на разных доменах или портах, убедитесь, что у вас настроены правильные политики CORS в вашем Startup.cs (или Program.cs, если у вас ASP.NET Core 6.0 и выше). Для этого добавьте следующее:

    services.AddCors(options =>
    {
       options.AddPolicy("AllowAllOrigins",
           builder =>
           {
               builder.AllowAnyOrigin()
                      .AllowAnyMethod()
                      .AllowAnyHeader();
           });
    });
    
    app.UseCors("AllowAllOrigins");
  4. Проверка аннотаций: Убедитесь, что в методе ApiTest в AuthController нет атрибутов валидации, которые могут блокировать ваш запрос, если переданные данные не соответствуют ожидаемому формату.

  5. Просмотр сообщения об ошибке: Обратите внимание на тело ответа при ошибке. Если используется application/problem+json, это может содержать дополнительную информацию о том, что не так с вашим запросом. Попробуйте прочитать содержимое ответа при возникновении ошибки:

    var errorContent = await response.Content.ReadAsStringAsync();
    ViewBag.ApiResponse = "Error: " + response.StatusCode + " - " + errorContent;

Если вы проверили все вышеупомянутое и ошибка сохраняется, рекомендуем использовать инструменты, такие как Postman или cURL, для самостоятельного тестирования вашего API вне контекста приложения. Это могут помочь вам избежать возможных ошибок связанных с CORS или конфигурацией HTTP-клиента.

В конце концов, убедитесь, что ваша конфигурация проекта и запуск приложения соответствуют требованиям, и проверьте, нет ли исключений в логах сервера, которые могут указать на более глубокие проблемы.

Оцените материал
Добавить комментарий

Капча загружается...