@savva09
Начинающий .NET-ер

Как адаптировать MapPost в метод ControllerBase?

Мне нужно обратиться к серверу с пост запросом. пока у меня есть вот такое обращение:
private static HttpClient _httpClient = new();

    public static async Task<string?> TestRequest()
    {
        string content = "TestContent";

        var responseMessage = await _httpClient.PostAsJsonAsync("https://localhost:7005/Api", content);

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


И обработчик на стороне сервера:
[ApiController]
[Route("[controller]")]
public class ApiController : ControllerBase
{
    [HttpPost]
    public ActionResult AddRequest(string? message)
    {
        if (message == null)
            return BadRequest();
        
        return Ok(message);
    }
}


Вот здесь на метанит есть пример с пост запросом, но он написан в Program.cs, но тут, в устаревшем руководстве, есть решение как мне надо. Но сервер все равно почему-то возвращает 400

Ну и соответственно вылазят ошибки автоматического JsonSerializer

код из тут:
[HttpPost]
        public async Task<ActionResult<User>> Post(User user)
        {
            if (user == null)
            {
                return BadRequest();
            }
 
            db.Users.Add(user);
            await db.SaveChangesAsync();
            return Ok(user);
        }


код из здесь:
app.MapPost("/api/users", (Person user)=>{
 
    // устанавливаем id для нового пользователя
    user.Id = id++;
    // добавляем пользователя в список
    users.Add(user);
    return user;
});
  • Вопрос задан
  • 49 просмотров
Пригласить эксперта
Ответы на вопрос 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
Вынесено из комментариев (не туда запостил):

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

И да, к контроллеру на Minimal API из вашего первого комментария все это точно так же относится.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы