Razumijevanje vezivanja parametara u ASP.Net Web API-ju

ASP.Net Web API lagan je okvir koji se može koristiti za izgradnju RESTful HTTP usluga. Kada radite s metodama kontrolera u web API-ju, često ćete trebati prosljeđivati ​​parametre tim metodama. Ovdje se "parametar" jednostavno odnosi na argument metode, dok se "vezivanje parametara" odnosi na postupak postavljanja vrijednosti na parametre metoda web API-ja.

Imajte na umu da postoje dva načina na koja Web API može povezati parametre: vezivanje modela i formatiranje. Vezivanje modela koristi se za čitanje iz niza upita, dok se formatičari koriste za čitanje iz tijela zahtjeva. Također možete koristiti pretvarače tipova da omogućite Web API-ju da klasu tretira kao jednostavan tip, a zatim veže parametar iz URI-ja. Da biste to učinili, morat ćete stvoriti prilagođeni TypeConverter. Također možete stvoriti prilagođeni vezivni model primjenom sučelja IModelBinder u svojoj klasi, a zatim implementacijom metode BindModel. Za više informacija o pretvaračima tipova i vezivima modela pogledajte ovu Microsoftovu dokumentaciju.

Sada, da bi povezao parametre, Web API slijedi ovo pravilo: Za jednostavne tipove Web API pokušava dobiti vrijednost iz URI-ja, a za složene tipove, Web API pokušava dobiti vrijednost iz tijela zahtjeva. Jednostavni tipovi ovdje se odnose na primitivne tipove .Net - int, bool, double, float i tako dalje - i na druge vrste koje uključuju TimeSpan, DateTime, Guid, decimalni niz i niz. Također uključuje bilo koju vrstu za koju je dostupan pretvarač vrsta koji može pretvoriti iz niza. U sljedećem odjeljku istražit ćemo atribute [FromBody] i [FromUri] koji se koriste za povezivanje vrijednosti iz tijela zahtjeva i URI-ja.

Kada koristiti [FromBody] i [FromUri] u web API-ju

Ako već neko vrijeme koristite web API, možda su vam poznati atributi [FromBody] i [FromUri]. Atribut [FromUri] prefiksan je za parametar da specificira da vrijednost treba čitati iz URI-ja zahtjeva, a atribut [FromBody] koristi se za specificiranje da vrijednost treba čitati iz tijela zahtjeva.

Za sve primitivne vrste (int, double, float, itd.), Web API runtime pokušava pročitati vrijednost iz URI-ja HTTP zahtjeva. Za složene tipove (instance klasa), vrijeme izvođenja Web API-a pokušava pročitati vrijednost iz tijela HTTP zahtjeva pomoću programa za oblikovanje medija. Ovo je zadano ponašanje Web API-ja. 

Stoga, ako u URI-ju zahtjeva imate vrijednost primitivnog tipa, ne trebate navesti atribut [FromUri]. Slično tome, ako imate vrijednost u tijelu zahtjeva složenog tipa, ne morate navesti atribut [FromBody]. Međutim, ako se primitivni tip nalazi u tijelu zahtjeva ili složeni tip nalazi se u URI-ju zahtjeva, morate navesti atribut [FromBody] ili [FromUri]. Razlog je taj što se u oba slučaja udaljavate od zadanog ponašanja.

Kako koristiti [FromBody] i [FromUri] u web API-ju

Sljedeći isječak koda ilustrira kako možete odrediti atribut [FromBody] za osnovni tip podataka koji se prosljeđuje kao parametar metodi Web API.

javna klasa SecurityController: ApiController

{

    javni HttpResponseMessage Post ([FromBody] int id)

    {

       // Ovdje napišite svoj kod

    }

}

I ovdje je isječak koda koji ilustrira kako složeni tip kao parametar možete proslijediti metodi Web API pomoću atributa FromUri.

javna klasa SecurityController: ApiController

{

    javni HttpResponseMessage Post (Korisnik [FromUri])

    {

       // Ovdje napišite svoj kod

    }

}

Treba napomenuti da slanje podataka za autentifikaciju korisnika poput korisničkog imena i lozinke putem URI-a nije dobra praksa, čak i ako možda koristite SSL. To je zato što se takvi podaci mogu spremiti u zapisnike preglednika, gdje su izloženi izloženosti. Kada prosljeđujete bilo koji osjetljivi podatak (korisnička imena, lozinke, podaci o kreditnoj kartici itd.) Putem tijela zahtjeva, neophodno je koristiti [FromBody] u svakom slučaju.

Imajte na umu da kada koristite atribut [FromBody] dok prosljeđujete parametar metodi Web API, vrijeme izvođenja Web API koristi prednost zaglavlja vrste sadržaja za odabir ispravnog oblikovača. Iz mog članka ovdje možete saznati više o pregovaranju o sadržaju u web API-ju.