Сообщение с int / string (простой тип) в теле на asp.net core web api 2.1 не работает - PullRequest
0 голосов
/ 25 октября 2018

Мне просто не повезло, что я отправил значение формы в кодировке url от почтальона в web-интерфейс 2.1 vanilla asp.net core, созданный с помощью file-> new project.Я ничего не делаю с этим, но все же новая функция проверки модели, кажется, срабатывает и возвращает почтальону 400 плохих запросов.Может кто-нибудь сказать мне, что я делаю не так?

Действие контроллера:

// POST api/values
[HttpPost]
public void Post([FromBody] string value)
{
}

Необработанный запрос (как видно из fiddler):

POST http://localhost:60843/api/values HTTP/1.1
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: a791eee7-63ff-4106-926f-2s67a8dcf37f
User-Agent: PostmanRuntime/7.3.0
Accept: */*
Host: localhost:60843
accept-encoding: gzip, deflate
content-length: 7
Connection: keep-alive

value=test

Необработанный ответ:

HTTP/1.1 400 Bad Request
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Server: Kestrel
X-SourceFiles: =?UTF-8?BQzpcUmVwb3NcVGVzdGJlZFxNb2RlbEJpbmRpbmdcTW9kZWxCaW5kaW5nXGFwaVx2YWx1ZXM=?=
X-Powered-By: ASP.NET
Date: Thu, 25 Oct 2018 15:23:49 GMT

21
{"":["The input was not valid."]}
0

Еще раз отметим, что это шаблон по умолчанию для веб-API asp.net в Visual Studio 2017.

Интересным фактом является то, что если я добавлю Swashbuckle и перейду к конечной точке пользовательского интерфейса Swaggerи использовать встроенную функцию «попробуй», она также выдает ошибку «из коробки».

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

1 Ответ

0 голосов
/ 25 октября 2018

Для тех, кто сталкивается с этим вопросом, начиная с версии 2.1, по умолчанию применяется автоматическое связывание модели, и возвращается 400 Неверный запрос, если связывание модели не удается (измените более ранние версии, которые требовали проверить ModelState.IsValid, чтобы увидеть, если модельпривязка прошла успешно).

При публикации простых типов в действии основного контроллера asp.net вы должны указать, откуда оно поступает.Сложные типы могут быть выведены, но простые типы, такие как int и string, не могут (если они находятся в теле сообщения, то есть. Они выводятся, если они находятся либо в строке запроса, либо в маршруте (url)).Я вижу два варианта передачи значений в самом теле:

  1. Посредством URL-адреса в виде значения формы (добавьте [FromForm] к вашему параметру в действии)

Запрос от почтальона:

POST http://your-url/api/values HTTP/1.1
Content-Type: application/x-www-form-urlencoded

value=test

Подпись метода действия:

[HttpPost]
public void Post([FromForm]string value)
{
}
В виде тела json (добавьте [FromBody] к вашему параметру в действии)

Запрос от почтальона:

POST http://your-url/api/values HTTP/1.1
Content-Type: application/json

"test"

Действиеподпись метода:

[HttpPost]
public void Post([FromBody]string value)
{
}
...