stevenlam505 Ответов: 1

Почему моя строка JSON, передаваемая в мой webapi, отображается как null?


Я пишу код для консольного приложения, которое отправляет HttpPostRequest в WebAPI, который позже будет отправлять электронные письма и текстовые сообщения группе людей. Эта информация хранится в виде строки JSON в консольном приложении и передается в WebAPI. При публикации я получаю StatusCode 200, указывающий на успешную операцию, но когда я проверяю API, я вижу, что переданное значение равно "null". Может кто-нибудь сказать мне, почему это происходит? Я включил код для консольного приложения и WebAPI.

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

Контроллер WebAPI:
[ApiController]
[Route("[controller]")]
public class GeneratorStatusController : ControllerBase
{
    Emails emailList = new Emails();
    public GeneratorStatusController(IGeneratorService generatorService)
    {
        this.generatorService = generatorService;
    }

    static List<string> strings = new List<string>()
    {
        "value0", "value1", "value2"
    };
    private readonly IGeneratorService generatorService;

    [HttpGet]
    public List<string> GetString()
    {
        return strings;
    }

    [HttpPost]
    public List<string> PostString(string input)
    {
        Console.WriteLine(input);

        // Send Emails Placeholder
        strings.Add(input); // When adding it to "strings", the value is null
        return strings;
    }
}
Консольное приложение, отправляющее запрос post:
static async Task SendPost(string machineName, List<string> emailAddresses, List<string> phoneNumbers)
{
    string url = "https://localhost:44312/GeneratorStatus/";
    HttpClient client = new HttpClient();

    string name = JsonConvert.SerializeObject(machineName);
    string emails = JsonConvert.SerializeObject(emailAddresses);
    string phones = JsonConvert.SerializeObject(phoneNumbers);

    var jsonMessage = JsonConvert.SerializeObject(new[] 
                     {JsonConvert.DeserializeObject(name),
                      JsonConvert.DeserializeObject(emails),
                      JsonConvert.DeserializeObject(phones) });

    Console.WriteLine(jsonMessage);

    var response = await client.PostAsync(url, new StringContent(jsonMessage, Encoding.UTF8, "application/json"));
    Console.WriteLine(response);
}

1 Ответов

Рейтинг:
2

Richard Deeming

Вам нужно добавить следующее [FromBody] атрибут к вашему input параметр:

[HttpPost]
public List<string> PostString([FromBody] string input)
Привязка модели в ASP.NET ядро | Microsoft Docs[^]

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

Однако, поскольку входные данные метода являются строкой, вы будет нужно дважды закодировать тело вашего запроса. В противном случае, СМИ форматирования будет декодировать поставляемого JSON, а затем отказываются связывать строки массива string параметр.
static async Task SendPost(string machineName, List<string> emailAddresses, List<string> phoneNumbers)
{
    string url = "https://localhost:44312/GeneratorStatus/";
    HttpClient client = new HttpClient();

    var jsonMessage = JsonConvert.SerializeObject(new[] 
    {
        machineName,
        emailAddresses,
        phoneNumbers
    });

    Console.WriteLine(jsonMessage);
    
    // Serialize it again so that the server will treat it as a string:
    jsonMessage = JsonConvert.SerializeObject(jsonMessage);
    Console.WriteLine(jsonMessage);

    var response = await client.PostAsync(url, new StringContent(jsonMessage, Encoding.UTF8, "application/json"));
    Console.WriteLine(response);
}

Как уже упоминалось в решении для ваш предыдущий вопрос[^], вы действительно должны использовать строго типизированную модель вместо передачи строки JSON.


stevenlam505

Когда я использую [FromBody] Я сталкиваюсь с кодом состояния 400. Это была моя первоначальная реализация.

Richard Deeming

Поскольку метод API ожидает a строка, и вы отправляете JSON-сериализованный массив объектов СМИ форматирования не будет в состоянии связать свой параметр.

Вам потребуется два раза сериализации параметра так, что средства форматирования десериализует тело запроса string.

Кроме того, измените параметр API на массив объектов или используйте строго типизированную модель.

stevenlam505

Как бы я изменил параметры на массив объектов?

Richard Deeming

[HttpPost]
public List<string> PostString([FromBody] object[] input)