Как сделать адаптацию метода MapPost для использования в классе ControllerBase?

  • 16 августа 2023 г. 7:06
Ответы на вопрос 3
Для использования адаптированного метода `MapPost` в классе `ControllerBase` вам необходимо выполнить следующие шаги:

1. Создайте класс `HttpService`, который будет обрабатывать все HTTP-запросы:
```csharp
public class HttpService
{
    private static HttpClient _httpClient = new();

    public static async Task<TResponse?> MapPost<TResponse, TRequest>(string url, TRequest request)
    {
        var responseMessage = await _httpClient.PostAsJsonAsync(url, request);

        if (!responseMessage.IsSuccessStatusCode)
        {
            throw new Exception($"HTTP request failed with status code {(int)responseMessage.StatusCode} - {responseMessage.ReasonPhrase}");
        }

        return await responseMessage.Content.ReadFromJsonAsync<TResponse>();
    }
}
```

2. В классе `ControllerBase` вызовите метод `MapPost` для отправки HTTP-запроса:
```csharp
public async Task<string?> TestRequest()
{
    string content = "TestContent";

    var response = await HttpService.MapPost<string, string>("https://localhost:7005/Api", content);
    
    return response;
}
```

3. Обновите обработчик в классе `ApiController`, указав модель вместо строки:
```csharp
[HttpPost]
public async Task<ActionResult<User>> AddRequest(User user)
{
    if (user == null)
    {
        return BadRequest();
    }

    db.Users.Add(user);
    await db.SaveChangesAsync();
    return Ok(user);
}
```

Теперь вы можете использовать адаптированный метод `MapPost` для отправки POST-запроса и передачи модели `User`.
Если бы я был контроллером API на MVC, то я бы ответил следующим образом: "Ваш запрос содержит некорректные данные" (код статуса 400 в протоколе HTTP). Контроллер API ожидает получить значение параметра "message" в вашем методе действия. Если вы отправляете запрос в формате JSON, то это должен быть объект с полем "message". Таким образом, в запросе POST необходимо отправить объект с полем "message". Например, вы можете использовать следующий код для создания объекта в строковом формате: string content = "TestContent". Также можно использовать объект с полем "message" в качестве "content", например, анонимный тип: var content = new { message = "TestContent" }. Метод PostAsJsonAsync сможет преобразовать это в формат JSON. И да, эти же правила относятся и к контроллеру на Minimal API, о котором вы упомянули в своем первом комментарии.
Если бы я был контроллером API на MVC, я бы также ответил следующим образом: "Что это за данные, которые вы мне прислали?" (в протоколе HTTP это обозначается кодом статуса 400). Контроллер API ожидает, что вы предоставите ему что-то содержащее значение для параметра message вашего метода действия. Если вы отправляете данные в формате JSON, то это должен быть объект с полем message. Контроллер найдет входной параметр метода действия с таким же именем message, как у вас, и привяжет значение этого поля. Поэтому в вашем запросе POST необходимо отправлять объект с этим полем. Например, вы можете использовать уже сериализованное (преобразованное в строку) значение: string content = "TestContent". Однако, вы также можете использовать объект с полем message, например, анонимный тип: var content = new { message = "TestContent" }. Метод PostAsJsonAsync сможет преобразовать это в JSON. И да, все это также применимо к контроллеру на Minimal API, о котором вы упоминали в вашем первом комментарии.
Похожие вопросы