Как да предавам множество параметри на методите на контролера на Web API

В по-ранна публикация тук изследвахме обвързването на параметри в Web API. В тази публикация ще научим как да предаваме множество параметри на методите на контролера на Web API.

Web API предоставя необходимите методи за действие за операции HTTP GET, POST, PUT и DELETE. Обикновено бихте предали един обект като параметър на методите за действие PUT и POST. Обърнете внимание, че Web API по подразбиране не поддържа предаване на множество POST параметри към методите на контролера на Web API. Но какво, ако трябва да направите POST заявка с множество обекти, предадени като параметри на метод на уеб API контролер?

Разбиране на проблема

Web API не ви позволява да предавате множество сложни обекти в сигнатурата на метода на метод на контролер на Web API - можете да публикувате само една стойност в метод за действие на Web API. Тази стойност от своя страна дори може да бъде сложен обект. Възможно е да се предадат множество стойности чрез операция POST или PUT, като се преобразува един параметър в действителното съдържание, а останалите чрез низове за заявки.

Следващият клас на контролер съдържа POST метод с име Save, който приема множество параметри.

публичен клас AuthorsController: ApiController

    {

        [HttpPost]

        public HttpResponseMessage Save (int Id, низ FirstName, низ LastName, низ Address)

        {

            // Обикновен код

            върнете Request.CreateResponse (HttpStatusCode.OK, "Успех ...");

        }

   }

Сега да предположим, че се опитвате да извикате метода на контролера на уеб API от JQuery, както е показано по-долу.

$ .ajax ({

 url: 'api / автори',

 тип: „POST“,

 данни: {Id: 1, FirstName: 'Joydip', LastName: 'Kanjilal', Address: 'Hyderabad'},

 dataType: 'json',

 успех: функция (данни) {

предупреждение (данни);

}});

За съжаление това обаждане ще се провали, тъй като тази заявка не може да бъде обработена от уеб API. По същия начин, ако имате метод на уеб API контролер, който приема множество сложни обекти, няма да можете да извикате този метод директно от клиент по пряк начин.

[HttpPost]

public HttpResponseMessage PostAuthor (Автор автор, низ за удостоверяване Token)

{

  // Обикновен код

  върнете Request.CreateResponse (HttpStatusCode.OK, "Успех ...");

}

Можете да предавате параметри на методите на контролера на Web API, използвайки или атрибутите [FromBody] или [FromUri]. Имайте предвид, че атрибутът [FromBody] може да се използва само веднъж в списъка с параметри на метод. За да повторите, имате право да предавате само една стойност (прост или сложен тип) като параметър на метод на уеб API контролер, когато използвате атрибута [FromBody]. Можете да предадете произволен брой параметри, използвайки атрибута [FromUri], но това не е идеалното решение в нашия случай.

И сега, решението

Сега, след като разбрахме какъв е проблемът при предаване на параметри на метод на контролер на уеб API, нека разгледаме възможните решения. Един от начините да се постигне това е чрез предаване на сложния обект като атрибут [FromBody] и параметъра низ чрез Uri, както е показано в кодовия фрагмент по-долу.

$ .ajax ({

 url: 'api / автори? authenticationToken = abcxyz',

 тип: „POST“,

  данни: JSON.stringify (автор),

 dataType: 'json',

 успех: функция (данни) {

   предупреждение (данни);

}});

Ще трябва да промените съответно метода на вашия контролер на уеб API, за да анализирате низа на заявката, както е показано по-долу.

[HttpPost]

public HttpResponseMessage PostAuthor (Автор на автора)

{

  var data = Request.RequestUri.ParseQueryString ();

  низ критерии = queryItems ["authenticationToken"];

  // Обикновен код за съхраняване на данни в базата данни

  върнете Request.CreateResponse (HttpStatusCode.OK, "Успех ...");

}

Е, но какво ще стане, ако имате множество сложни обекти, които да бъдат предадени като параметри на метода на контролера на уеб API? Можете да създадете един обект, който обгръща множеството параметри. Обърнете се към класа AuthorRequest, даден по-долу.

публична класа AuthorRequest

   {

      публичен автор Автор {get; комплект; }

      публичен низ Token {get; комплект; }

   }

По принцип можете да обгърнете множество параметри в един клас и да използвате този клас като параметър за вашия метод на контролер на уеб API.

Ето актуализирания метод на контролера на уеб API.

[HttpPost]

public HttpResponseMessage PostAuthor (Искане на авторска заявка)

  {

       var author = request.Author;

       var token = request.Token;

       // Обикновен код за съхраняване на данни в базата данни

       върнете Request.CreateResponse (HttpStatusCode.OK, "Успех ...");

  }

Можете също да използвате JObject, за да анализирате множество стойности на параметри извън обект.

[HttpPost]

публичен HttpResponseMessage PostAuthor (JObject jsonData)

{

    динамичен json = jsonData;

    JObject jauthor = json.Author;

    низ от символи = json.Token;

    var автор = jauthor.ToObject ();

    // Обикновен код за съхраняване на данни в базата данни

    върнете Request.CreateResponse (HttpStatusCode.OK, "Успех ...");

}

Друг начин за решаване на това е използването на FormDataCollection. Между другото, FormDataCollection е колекция от двойки ключ / стойност, подобно на FormCollection в MVC.

[HttpPost]

        public HttpResponseMessage PostAuthor (FormDataCollection form)

        {

            var author = form.Get ("Автор");

            var token = form.Get ("Token");

            // Обикновен код за съхраняване на данни в базата данни

            върнете Request.CreateResponse (HttpStatusCode.OK, "Успех ...");

        }

Благодарение на разширяемостта на рамката на уеб API, можете също да създадете свой собствен потребителски свързващ елемент, като разширите класа HttpParameterBinding, за да осигурите поддръжка за свързване на множество параметри.

Как да направите повече в ASP.NET и ASP.NET Core:

  • Как да използвам кеширането в паметта в ASP.NET Core
  • Как да се справим с грешки в ASP.NET Web API
  • Как да предавам множество параметри на методите на контролера на Web API
  • Как да регистрирам метаданни за заявки и отговори в ASP.NET Web API
  • Как да работя с HttpModules в ASP.NET
  • Разширено създаване на версии в ASP.NET Core Web API
  • Как да използвам инжектиране на зависимост в ASP.NET Core
  • Как да работите със сесии в ASP.NET
  • Как да работя с HTTPHandlers в ASP.NET
  • Как да използвам IHostedService в ASP.NET Core
  • Как да консумираме услуга WCF SOAP в ASP.NET Core
  • Как да подобрите производителността на приложенията на ASP.NET Core
  • Как да консумирате ASP.NET Core Web API с помощта на RestSharp
  • Как да работя с регистриране в ASP.NET Core
  • Как да използвам MediatR в ASP.NET Core
  • Как да работите със състоянието на сесията в ASP.NET Core
  • Как да използвам Nancy в ASP.NET Core
  • Разберете обвързването на параметри в ASP.NET Web API
  • Как да качвате файлове в ASP.NET Core MVC
  • Как да приложим обработка на глобални изключения в ASP.NET Core Web API
  • Как да приложим проверки на състоянието в ASP.NET Core
  • Най-добри практики за кеширане в ASP.NET
  • Как да използвам съобщенията на Apache Kafka в .NET
  • Как да активирате CORS на вашия уеб API
  • Кога да се използва WebClient срещу HttpClient срещу HttpWebRequest
  • Как да работите с Redis Cache в .NET
  • Кога да използвате Task.WaitAll срещу Task.WhenAll в .NET