ASP.Net Web API er et lett rammeverk som kan brukes til å bygge RESTful HTTP-tjenester. Når du arbeider med kontrollermetoder i Web API, må du ofte sende parametere til disse metodene. En "parameter" refererer her ganske enkelt til argumentet til en metode, mens "parameterbinding" refererer til prosessen med å sette verdier til parametrene til Web API-metodene.
Merk at det er to måter Web API kan binde parametere på: modellbinding og formatering. Modellinnbinding brukes til å lese fra spørringsstrengen, mens formatere brukes til å lese fra forespørselen. Du kan også bruke omformere for å aktivere Web API for å behandle en klasse som en enkel type og deretter binde parameteren fra URI. For å gjøre dette må du opprette en tilpasset TypeConverter. Du kan også opprette en tilpasset modellperm ved å implementere IModelBinder-grensesnittet i klassen din og deretter implementere BindModel-metoden. Hvis du vil ha mer informasjon om typeomformere og modellbindere, kan du ta en titt på denne Microsoft-dokumentasjonen.
Nå, for å binde parametere, følger Web API denne regelen: For enkle typer prøver Web API å hente verdien fra URI, og for komplekse typer prøver Web API å hente verdien fra forespørselstypen. De enkle typene her refererer til både .Net primitive typer - int, bool, double, float og så videre - og til andre typer som inkluderer TimeSpan, DateTime, Guid, desimal og streng. Den inkluderer også alle typer som en typekonverterer er tilgjengelig som kan konverteres fra en streng. I neste avsnitt vil vi utforske attributtene [FromBody] og [FromUri] som brukes til å binde verdier fra henholdsvis forespørselens organ og URI.
Når skal du bruke [FromBody] og [FromUri] i Web API
Hvis du har brukt Web API en stund, kan du være kjent med attributtene [FromBody] og [FromUri]. [FromUri] -attributtet er foran parameteren for å spesifisere at verdien skal leses fra URI for forespørselen, og [FromBody] -attributtet brukes til å spesifisere at verdien skal leses fra forespørselens brødtekst.
For alle primitive typer (int, double, float, etc.) prøver Web API-kjøretiden å lese verdien fra URI for HTTP-forespørselen. For komplekse typer (forekomster av klasser) prøver Web API-kjøretiden å lese verdien fra kroppen til HTTP-forespørselen ved hjelp av en formatering av medietypen. Dette er standardoppførselen til Web API.
Derfor, hvis du har en verdi i forespørsels-URI som er en primitiv type, trenger du ikke å spesifisere [FromUri] -attributtet. På samme måte, hvis du har en verdi i forespørselens kropp som er en kompleks type, trenger du ikke å spesifisere [FromBody] -attributtet. Imidlertid, hvis den primitive typen ligger i forespørselens kropp eller den komplekse typen ligger i forespørselens URI, må du spesifisere [FromBody] eller [FromUri] -attributtet. Årsaken er at du avviker fra standardadferden i begge tilfeller.
Hvordan bruke [FromBody] og [FromUri] i Web API
Følgende kodebit illustrerer hvordan du kan spesifisere [FromBody] -attributtet for en grunnleggende datatype sendt som en parameter til en Web API-metode.
offentlig klasse SecurityController: ApiController{
offentlig HttpResponseMessage Innlegg ([FromBody] int id)
{
// Skriv koden din her
}
}
Og her er et kodebit som illustrerer hvordan du kan overføre en kompleks type som parameter til en Web API-metode ved hjelp av FromUri-attributtet.
offentlig klasse SecurityController: ApiController{
offentlig HttpResponseMessage-innlegg ([FromUri] brukerbruker)
{
// Skriv koden din her
}
}
Det skal bemerkes at det ikke er god praksis å sende brukerautentiseringsdata som brukernavn og passord gjennom URI, selv om du kanskje bruker SSL. Dette er fordi slike data kan lagres i nettleserloggene, der de er utsatt for eksponering. Når du overfører sensitive data (brukernavn, passord, kredittkortinformasjon, etc.) via forespørselsorganet, er det viktig å bruke [FromBody] i alle tilfeller.
Merk at når du bruker attributtet [FromBody] mens du overfører en parameter til en Web API-metode, utnytter Web API-kjøretiden innholdstypeoverskriften for å velge riktig formatering. Du kan lære mer om innholdsforhandlinger i Web API fra artikkelen min her.