Kako proslijediti više parametara metodama kontrolera Web API-ja

U ranijem postu ovdje smo istražili vezivanje parametara u Web API-ju. U ovom ćemo postu naučiti kako prosljeđivati ​​više parametara metodama kontrolera Web API-ja.

Web API pruža potrebne radne metode za HTTP GET, POST, PUT i DELETE operacije. Obično biste jedan objekt kao parametar prosljeđivali metodama PUT i POST. Imajte na umu da Web API prema zadanim postavkama ne podržava prosljeđivanje više POST parametara metodama kontrolera Web API-ja. Ali što ako biste poslali POST zahtjev s više objekata prosljeđenih kao parametri na metodu kontrolera Web API-ja?

Razumijevanje problema

Web API ne dopušta vam prosljeđivanje višestruko složenih objekata u potpisu metode metode Web API kontrolera - u metodu radnje Web API-ja možete objaviti samo jednu vrijednost. Ova vrijednost pak može biti i složeni objekt. Moguće je proslijediti više vrijednosti putem operacije POST ili PUT preslikavanjem jednog parametra na stvarni sadržaj, a preostale putem stringova upita.

Sljedeća klasa kontrolera sadrži POST metodu pod nazivom Spremi koja prihvaća više parametara.

javna klasa AuthorsController: ApiController

    {

        [HttpPost]

        public HttpResponseMessage Save (int Id, string FirstName, string LastName, string Address)

        {

            // Uobičajeni kod

            vratiti Request.CreateResponse (HttpStatusCode.OK, "Uspjeh ...");

        }

   }

Sada pretpostavimo da pokušate nazvati metodu Web API kontrolera iz JQueryja kao što je prikazano u nastavku.

$ .ajax ({

 url: 'api / autori',

 tip: 'POST',

 podaci: {Id: 1, Ime: 'Joydip', Prezime: 'Kanjilal', Adresa: 'Hyderabad'},

 dataType: 'json',

 uspjeh: funkcija (podaci) {

upozorenje (podaci);

}});

Nažalost, ovaj poziv neće uspjeti jer web API ne može obraditi ovaj zahtjev. Slično tome, ako imate metodu Web API kontrolera koja prihvaća više složenih objekata, ne biste mogli izravno pozivati ​​ovu metodu izravno od klijenta.

[HttpPost]

javni HttpResponseMessage PostAuthor (autor autora, string authenticationToken)

{

  // Uobičajeni kod

  vratiti Request.CreateResponse (HttpStatusCode.OK, "Uspjeh ...");

}

Parametre možete proslijediti metodama kontrolera web API-ja koristeći atribute [FromBody] ili [FromUri]. Imajte na umu da se atribut [FromBody] može koristiti samo jednom na popisu parametara metode. Da ponovimo, smijete proslijediti samo jednu vrijednost (jednostavni ili složeni tip) kao parametar metodi Web API kontrolera kada koristite atribut [FromBody]. Pomoću atributa [FromUri] možete proslijediti bilo koji broj parametara, ali to u našem slučaju nije idealno rješenje.

A sada, rješenje

Sad kad smo shvatili u čemu je problem prilikom prosljeđivanja parametara na metodu Web API kontrolera, istražimo moguća rješenja. Jedan od načina da se to postigne je prosljeđivanje složenog objekta kao atributa [FromBody] i parametra niza putem Uri-a kao što je prikazano u isječku koda u nastavku.

$ .ajax ({

 url: 'api / autori? authenticationToken = abcxyz',

 tip: 'POST',

  podaci: JSON.stringify (autor),

 dataType: 'json',

 uspjeh: funkcija (podaci) {

   upozorenje (podaci);

}});

Morali biste u skladu s tim izmijeniti metodu kontrolera web API-ja kako biste raščlanili niz upita kao što je prikazano u nastavku.

[HttpPost]

public HttpResponseMessage PostAuthor (autor autora)

{

  var podaci = Request.RequestUri.ParseQueryString ();

  niz kriterija = queryItems ["authenticationToken"];

  // Uobičajeni kod za pohranu podataka u bazu podataka

  vratiti Request.CreateResponse (HttpStatusCode.OK, "Uspjeh ...");

}

Pa, ali što ako imate više složenih objekata koji se kao parametri prosljeđuju metodi Web API kontrolera? Možete stvoriti jedan objekt koji obavija više parametara. Pogledajte klasu AuthorRequest navedenu u nastavku.

javni razred AuthorRequest

   {

      javni autor Autor {get; postavljen; }

      javni niz žetona {get; postavljen; }

   }

U osnovi, možete omotati više parametara u jednu klasu i koristiti ovu klasu kao parametar za vašu metodu Web API kontrolera.

Evo ažurirane metode kontrolera web API-ja.

[HttpPost]

javni HttpResponseMessage PostAuthor (zahtjev za autorskim zahtjevom)

  {

       var autor = zahtjev.Autor;

       var token = zahtjev.Token;

       // Uobičajeni kod za pohranu podataka u bazu podataka

       vratiti Request.CreateResponse (HttpStatusCode.OK, "Uspjeh ...");

  }

JObject također možete koristiti za raščlanjivanje višestrukih vrijednosti parametara izvan objekta.

[HttpPost]

javni HttpResponseMessage PostAuthor (JObject jsonData)

{

    dinamički json = jsonData;

    JObject jauthor = json.Author;

    žeton niza = json.Token;

    var autor = jauthor.ToObject ();

    // Uobičajeni kod za pohranu podataka u bazu podataka

    vratiti Request.CreateResponse (HttpStatusCode.OK, "Uspjeh ...");

}

Drugi način da se to riješi je korištenje FormDataCollection. Inače, FormDataCollection je kolekcija parova ključ / vrijednost slično kao FormCollection u MVC-u.

[HttpPost]

        javni HttpResponseMessage PostAuthor (obrazacDataCollection)

        {

            var autor = form.Get ("Autor");

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

            // Uobičajeni kod za pohranu podataka u bazu podataka

            vratiti Request.CreateResponse (HttpStatusCode.OK, "Uspjeh ...");

        }

Zahvaljujući proširivosti web API okvira, možete stvoriti i svoje prilagođeno vezivo parametara proširivanjem klase HttpParameterBinding kako biste pružili podršku za vezanje više parametara.

Kako učiniti više u ASP.NET i ASP.NET Core:

  • Kako se koristi predmemoriranje u memoriji u ASP.NET Core
  • Kako postupati s pogreškama u ASP.NET web API-ju
  • Kako proslijediti više parametara metodama kontrolera Web API-ja
  • Kako prijaviti metapodatke zahtjeva i odgovora u ASP.NET Web API
  • Kako raditi s HttpModules-om u ASP.NET-u
  • Napredna verzija u ASP.NET Core Web API
  • Kako se koristi ubrizgavanje ovisnosti u ASP.NET Core
  • Kako raditi sa sesijama u ASP.NET-u
  • Kako raditi s HTTPHandlerima u ASP.NET-u
  • Kako koristiti IHostedService u ASP.NET Core
  • Kako potrošiti WCF SOAP uslugu u ASP.NET Core
  • Kako poboljšati izvedbu ASP.NET Core aplikacija
  • Kako konzumirati ASP.NET Core Web API pomoću RestSharp
  • Kako raditi s prijavom u ASP.NET Core
  • Kako koristiti MediatR u ASP.NET Core
  • Kako raditi sa stanjem sesije u ASP.NET Coreu
  • Kako koristiti Nancy u ASP.NET Coreu
  • Razumijevanje vezivanja parametara u ASP.NET Web API-ju
  • Kako prenijeti datoteke u ASP.NET Core MVC
  • Kako implementirati rukovanje globalnim iznimkama u ASP.NET Core Web API
  • Kako implementirati provjere zdravlja u ASP.NET Core
  • Najbolji primjeri u predmemoriranju u ASP.NET-u
  • Kako koristiti Apache Kafka razmjenu poruka u .NET-u
  • Kako omogućiti CORS na vašem web API-ju
  • Kada koristiti WebClient u odnosu na HttpClient u odnosu na HttpWebRequest
  • Kako raditi s predmemorijom Redis u .NET-u
  • Kada koristiti Task.WaitAll vs. Task.WhenAll u .NET