stevenlam505 Ответов: 1

Как заставить webapi принимать POST-запросы с вводом данных?


Я могу отправить post-запрос на сервер с помощью:
static async Task SendPost(string jsonMessage)
{
    string url = "https://localhost:44312/GeneratorStatus/PostString";
    HttpClient client = new HttpClient();
    
    var response = await client.PostAsync(url, 
                                          new StringContent("TestMessage",
                                                            Encoding.UTF8,
                                                            "application/json")
                                         );

    Console.WriteLine(response);
}

Это мой контроллер:
[ApiController]
[Route("[controller]")]
public class GeneratorStatusController : ControllerBase
{
    Emails emailList = new Emails();

    [HttpPost("{input}")]
    public void PostString(string input)
    {
        emailList.SendEmail("fromEmail@gmail.com", "1234567890@txt.att.net",
        "Generator Off", input);
    }
}


Однако, когда я запускаю свой post-запрос с помощью HttpClient и отправляю post-запрос своему контроллеру API, он успешно отправляет запрос, но сообщение всегда приводит к "PostString" вместо моей входной переменной.

Что я уже пробовал:

[ApiController]
[Route("[controller]")]
public class GeneratorStatusController : ControllerBase
{
    Emails emailList = new Emails();

    [HttpPost("{input}")]
    public void PostString(string input)
    {
        emailList.SendEmail("fromEmail@gmail.com", "1234567890@txt.att.net",
        "Generator Off", input);
    }
}

Oshtri Deka

Где находится оператор return метода PostString?

stevenlam505

Он был у меня в исходном коде, и я забыл сделать его недействительным, когда отправил вопрос.

1 Ответов

Рейтинг:
4

Richard Deeming

Цитата:
[HttpPost("{input}")]
Ты связал меня по рукам и ногам. input параметр к маршруту. Все, что появляется в URL-адресе после /GeneratorStatus/ будет ли ценность вашей input параметр.

Измените свой метод API на:
[HttpPost]
public void PostString([FromBody] string input)
{
    ...
}
Измените код вызова, чтобы указать правильный URL-адрес и правильно передать содержимое:
string url = "https://localhost:44312/GeneratorStatus/";
HttpClient client = new HttpClient();
string input = JsonConvert.SerializeObject(jsonMessage);
var response = await client.PostAsync(url, new StringContent(input, Encoding.UTF8, "application/json"));
NB: Если вы загружаете данные как JSON, они должны быть действительными json. Если вы хотите опубликовать строку, она должна быть заключена в двойные кавычки и правильно экранирована. Просто разместить необработанное строковое значение не получится.

Привязка модели в ASP.NET ядро | Microsoft Docs[^]

NB: Вы также должны использовать IHttpClientFactory чтобы создать HttpClient например, в противном случае вы рискуете столкнуться с проблемами под нагрузкой:
Использование IHttpClientFactory для реализации устойчивых HTTP-запросов | Microsoft Docs[^]