Programiranje

Razumevanje vezave parametrov v spletnem API-ju ASP.Net

ASP.Net Web API je lahek okvir, ki ga lahko uporabimo za izdelavo RESTful HTTP storitev. Pri delu z metodami krmilnika v spletnem API-ju boste pogosto morali posredovati parametre tem metodam. "Parameter" se tukaj preprosto nanaša na argument metode, medtem ko se "vezava parametrov" nanaša na postopek nastavljanja vrednosti parametrom metod spletnega API-ja.

Upoštevajte, da lahko spletni API na dva načina veže parametre: vezavo modelov in oblikovalnike. Vezava modela se uporablja za branje iz niza poizvedbe, medtem ko se formatirniki uporabljajo za branje iz telesa zahteve. S pretvorniki vrst lahko s spletnim API-jem omogočite, da razred obravnava kot preprost tip in nato poveže parameter iz URI-ja. Če želite to narediti, morate ustvariti pretvornik TypeConverter po meri. Povezavo modela po meri lahko ustvarite tudi tako, da v svojem razredu implementirate vmesnik IModelBinder in nato izvedete metodo BindModel. Za več informacij o pretvornikih tipov in povezovalnih modelih si oglejte to Microsoftovo dokumentacijo.

Zdaj, da veže parametre, spletni API sledi temu pravilu: za preproste tipe skuša spletni API pridobiti vrednost iz URI-ja, za zapletene vrste pa spletni API skuša pridobiti vrednost iz telesa zahteve. Preprosti tipi se tukaj nanašajo na primitivne vrste .Net - int, bool, double, float itd., Pa tudi na druge tipe, ki vključujejo TimeSpan, DateTime, Guid, decimalno vrednost in niz. Vključuje tudi vse vrste, za katere je na voljo pretvornik vrst, ki jih je mogoče pretvoriti iz niza. V naslednjem razdelku bomo raziskali atributa [FromBody] in [FromUri], ki se uporabljata za vezavo vrednosti iz telesa zahteve oziroma URI.

Kdaj uporabiti [FromBody] in [FromUri] v spletnem API-ju

Če že nekaj časa uporabljate spletni API, ste morda seznanjeni z atributoma [FromBody] in [FromUri]. Atribut [FromUri] ima predpono pred parametrom, da določi, da je treba vrednost brati iz URI zahteve, atribut [FromBody] pa se uporablja za določitev, da je treba vrednost brati iz telesa zahteve.

Za vse primitivne vrste (int, double, float itd.) Izvajalno okolje Web API poskuša prebrati vrednost iz URI zahteve HTTP. Za zapletene tipe (primerke razredov) izvajalno okolje Web API poskuša odčitati vrednost iz telesa zahteve HTTP z oblikovalnikom medijskega tipa. To je privzeto vedenje spletnega API-ja.

Če imate torej v URI zahteve vrednost primitivnega tipa, vam ni treba navesti atributa [FromUri]. Če imate v telesu zahteve zapleteno vrsto, vam ni treba navesti atributa [FromBody]. Če pa je primitivni tip v telesu zahteve ali kompleksni tip v URI zahteve, morate podati atribut [FromBody] ali [FromUri]. Razlog je v tem, da se v obeh primerih oddaljujete od privzetega vedenja.

Kako uporabljati [FromBody] in [FromUri] v spletnem API-ju

Naslednji delček kode ponazarja, kako lahko podate atribut [FromBody] za osnovni podatkovni tip, ki se kot parameter posreduje metodi spletnega API-ja.

javni razred SecurityController: ApiController

{

public HttpResponseMessage Post ([idBod] int id)

    {

// Tukaj napišite kodo

    }

}

Tukaj je delček kode, ki ponazarja, kako lahko kompleksni tip kot parameter posredujete metodi spletnega API-ja z uporabo atributa FromUri.

javni razred SecurityController: ApiController

{

javna objava HttpResponseMessage (uporabnik [FromUri])

    {

// Tukaj napišite kodo

    }

}

Upoštevati je treba, da pošiljanje podatkov za preverjanje pristnosti uporabnika, kot sta uporabniško ime in geslo, prek URI-ja ni dobra praksa, tudi če morda uporabljate SSL. To je zato, ker se takšni podatki lahko shranijo v dnevnike brskalnika, kjer so izpostavljeni izpostavljenosti. Ko posredujete občutljive podatke (uporabniška imena, gesla, podatke o kreditnih karticah itd.) Prek telesa zahteve, morate v vsakem primeru uporabiti [FromBody].

Ko atribut [FromBody] uporabljate med posredovanjem parametra metodi spletnega API-ja, izvajalno okolje Web API izkoristi glavo vrste vsebine, da izbere pravilno oblikovalnik. Več o pogajanju o vsebini v spletnem API-ju lahko izveste iz mojega članka tukaj.