AspNetCore не может получить значение полезной нагрузки в действии POST - PullRequest
0 голосов
/ 08 мая 2020

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

[Route("[controller]")]
[ApiController]

public class TestController : ControllerBase
{
    [HttpPost]
    public object Post(string data)
    {
        return Ok();
    }
}

У меня есть точка останова на Ok (). Я использую cURL для тестирования.

Я пробовал эту команду curl -d data:"hello" -X POST http://localhost:80/test и эту команду curl -d "hello" -X POST http://localhost:80/test

Параметр data всегда равен нулю в точке останова.

Если я добавлю [FromBody] к параметру:

public object Post([FromBody] string data)
{
    return Ok();
}

Точка останова никогда не будет достигнута, а asp net ядро ​​внутренне вернет 400 - Введенные данные недействительны. но он ничего не регистрирует о том, почему введенные данные недействительны.

1 Ответ

0 голосов
/ 08 мая 2020

ASP. net ядро ​​по умолчанию поддерживает только json полезные нагрузки в POST.

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

Это решение для получения опубликованных файлов, содержащих простой текст.

Например. curl -F data=@test.txt -X POST http://localhost:80/test

Начните с удаления параметра string data.

Добавьте этот метод в свой контроллер:

    private string GetPostedFile(string fileName)
    {
        IFormFile data = Request.Form.Files[fileName];
        var bytes = new byte[data.Length];
        var result = data.OpenReadStream().ReadAsync(bytes).Result;
        return System.Text.Encoding.Default.GetString(bytes);
    }

Теперь вы можете получить данные, сославшись на GetPostedFile в обработчике POST, например:

[HttpPost]
public object Post()
{
    string data = GetPostedFile("data");
    return Ok();
}  

Это получит значение вашего опубликованного файла, которое в команде curl называется «данными».

...