Неправильный ввод .Net Core Web API - PullRequest
0 голосов
/ 06 июля 2018

Я столкнулся со странной проблемой и почти безуспешно провел 4 часа.

У меня есть простой веб-API, который я вызываю при отправке формы.

API-

// POST: api/Tool
[HttpPost]
public void Post([FromBody] Object value)
{
    _toolService.CreateToolDetail(Convert.ToString(value));
}

HTML-

<!DOCTYPE html>
<html>
<body>

<h2>HTML Forms</h2>
<form name="value" action="https://localhost:44352/api/tool" method="post">
  First name:<br>
  <input type="text" id="PropertyA" name="PropertyA" value="Some value A">
  <br>
  Last name:<br>
  <input type="text" id="PropertyB" name="PropertyB" value="Some value B">
  <br><br>
  <!--<input type="file" id="Files" name="Files" multiple="multiple"/>-->
  <br><br>
  <input type="submit" value="Submit">

  </form>
</body>
</html>

Когда я нажимаю кнопку отправки, я получаю ошибку ниже -

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

Конфигурации в классе запуска-

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    services.AddSingleton<IConfiguration>(Configuration);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseMvc();
}

Это происходит только для POST-запроса. GET-запрос работает нормально. Та же проблема при тестировании в REST клиенте Postman. Любая помощь, пожалуйста? Пожалуйста, дайте мне знать, если я могу предоставить более подробную информацию.

Ответы [ 6 ]

0 голосов
/ 29 июля 2019

Измените тип основного текста на требуемый формат, например, с текста на JSON (приложение).

0 голосов
/ 25 декабря 2018

Просто измените [FromBody] на [FromForm].
Атрибут FromForm предназначен для входящих данных из отправленной формы, отправленной типом контента application/x-www-url-formencoded, тогда как FromBody будет анализировать модель по умолчанию, который в большинстве случаев отправляется типом контента application/json из тело запроса.
Благодаря https://stackoverflow.com/a/50454145/5541434

0 голосов
/ 01 августа 2018

Я только что проработал подобную ситуацию здесь; Я смог использовать [FromBody] без проблем:

public class MyController : Controller
{
   [HttpPost]
   public async Task<IActionResult> SomeEndpoint([FromBody]Payload inPayload)
   {
   ...
   }
}

public class Payload
{
   public string SomeString { get; set; }
   public int SomeInt { get; set; }
}

Проблема, которую я выяснил, заключалась в том, чтобы гарантировать, что запросы выполняются с заголовком Content-Type, установленным как «application / json». При использовании Почтальона мой исходный запрос был возвращен как «Ввод был неверным». Добавление заголовка Content-Type устранило проблему для меня.

0 голосов
/ 06 июля 2018

Не используйте FromBody. Вы отправляете как x-www-form-urlencoded (то есть стандартное сообщение в форме HTML). Атрибут FromBody предназначен для JSON / XML.

Вы не можете обрабатывать обе стандартные формы, отправляемые и Тела запроса JSON / XML из одного действия. Если вам нужно запросить действие в обоих направлениях, вам понадобятся две отдельные конечные точки, одна с параметром, отмеченным FromBody, а другая без. Другого пути нет. Фактическая функциональность вашего действия может быть преобразована в частный метод, который могут использовать оба действия, чтобы уменьшить дублирование кода.

0 голосов
/ 06 июля 2018

Если вы изучите вкладку сети в своем браузере, вы заметите, что ваша форма отправляет входные значения в качестве параметров на ваш URL, а не отправляет сама . Таким образом, присвоение ему имени value не отправит свойство с именем "value" на ваш сервер.

Вместо этого метод post ожидает свойство с именем value , которое может быть любого типа (поскольку это объект), и этот параметр никогда не выполняется, так как он получает эти другие параметры: PropertyA, PropertyB и файлы.

Ваш полный пост, вероятно, должен выглядеть прямо сейчас:

https://localhost:44352/api/tool?PropertyA=X&PropertyB=Y&Files=Z

Также обратите внимание, что вы не указали URL-адрес для вашего Post метода, поэтому я не уверен, как клиент достигнет / api / Tool . Возможно, вам нужно указать этот URL на вашем контроллере, добавив атрибут Route :

[Маршрут ( "апи / инструмент")]

В противном случае естественным маршрутом является Hostname / Controller / Method или https://localhost:44352/api/post,, если ваш контроллер называется Api. В противном случае он заменит «api» на имя контроллера.

0 голосов
/ 06 июля 2018

Как сказали mjwills и DavidG, вам, вероятно, следует использовать конкретный класс в реализации параметров вашего контроллера, что-то вроде:

public class MyClass
{
    public string PropertyA { get; set; }

    public string PropertyB { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...