Programmering

Hvordan versjon av web-API-et

Du bør alltid versjon av web-API-en din samtidig som du beholder så mye av samme URI som mulig. Tenk deg en situasjon der du har et web-API som er oppe og går i produksjon og blir fortært av brukere. Anta at du trenger mer funksjonalitet i Web API, men du må holde den eksisterende funksjonaliteten intakt. Du kan ha noen få brukere som fortsatt trenger den gamle API-en, mens andre trenger en versjon med nye eller utvidede funksjoner. Dette er nøyaktig hvor Web API-versjonering kommer til unnsetning.

Du kan versjon Web API på en av følgende måter:

  1. Bruk URL-er: Versjonsinformasjon er spesifisert i URL-en som en spørringsstreng.
  2. Bruk overskrifter for egendefinerte forespørsler: Versjonsinformasjon for kontrolleren din er spesifisert i forespørselsoverskriften, uten behov for endringer i URL-en.
  3. Bruk Godta overskrifter: Godta overskrifter definerer vanligvis medietypen og tegnkodningene. Du kan sende versjonsinformasjon for web-API-en din via godta overskrifter uten å måtte endre URL-adressen.

Versjonering av web-API ved hjelp av URL-er

Tenk på følgende Web API-kontrollere, som har fått navnetForfattereV1Controller og ForfattereV2Controller henholdsvis.

public class AuthorsV1Controller: ApiController

    {

[HttpGet]

offentlige IEnumerable GetAuthors ()

        {

returner ny streng [] {"Joydip Kanjilal", "Gerben Wierda"};

        }

    }

offentlig klasse ForfattereV2Controller: ApiController

    {

[HttpGet]

offentlige IEnumerable GetAuthors ()

        {

returner ny streng [] {"Joydip Kanjilal, INDIA", "Gerben Wierda, Nederland"};

        }

    }

For å forenkle denne illustrasjonen har jeg innarbeidet en metode som heter GetAuthors () i hver kontroller. Samtidig som GetAuthors () i ForfattereV1Controller returnerer bare forfatternavnene, GetAuthors () i ForfattereV2Controller (den nye versjonen) returnerer forfatternavnene sammen med navnene på landene forfatterne er bosatt i.

Følgende kodebit viser hvordan de to kontrollerne bruker Register-metoden til WebApiConfig klasse.

config.Routes.MapHttpRoute (

navn: "WebAPIV1",

routeTemplate: "api / v1 / {controller} / {id}",

standardverdier: ny {controller = "AuthorsV1Controller", action = "GetAuthors", id = RouteParameter.Optional}

            );

config.Routes.MapHttpRoute (

navn: "WebAPIV2",

routeTemplate: "api / v2 / {controller} / {id}",

standardverdier: ny {controller = "AuthorsV2Controller", action = "GetAuthors", id = RouteParameter.Optional}

            );

Du kan nå påberope Web API-metoden GetAuthors ved hjelp av følgende URL.

// localhost / WebAPI / api / v1 / Forfattere / GetAuthors

Versjonering av Web API ved hjelp av forespørselstittelen

Du kan også implementere versjon av Web API ved hjelp av forespørselstittelen. For å oppnå dette må du implementere en tilpasset klasse som utvider StandardHttpControllerSelector klasse, deretter overstyre Velg kontroller i din tilpassede klasse. Merk at StandardHttpControllerSelector klasse implementerer IHttpControllerSelector grensesnitt.Velg kontroller ringer GetControllerName internt og godtar en forekomst av HttpRequestMessage som parameter.

Følgende kodebit illustrerer hvordan du kan hente versjonsinformasjon fra forespørselstittelen.

private string GetControllerVersionFromRequestHeader (HttpRequestMessage forespørsel)

        {

var acceptHeader = request.Headers.Accept;

const string headerName = "Versjon";

streng controllerVersjon = streng.Empty;

if (request.Headers.Contains (headerName))

            {

controllerVersion = "V" + request.Headers.GetValues ​​(headerName) .First ();

            }

retur controllerVersjon;

        }

Versjonering av web-API ved hjelp av aksepthodet

Følgende metode viser hvordan du kan hente versjonsinformasjon for web-API-et ditt fra godkjenningshodet. Metoden sjekker MIME-typen og returnerer versjonsinformasjonen på riktig måte. Hvis medietypen ikke er det søknad / json, blir standardversjonen returnert som V1.

private string GetControllerVersionFromAcceptHeader (HttpRequestMessage forespørsel)

        {

var acceptHeader = request.Headers.Accept;

streng controllerVersjon = streng.Empty;

foreach (var mime in acceptHeader)

            {

if (mime.MediaType.Equals ("application / json"))

                {

NameValueHeaderValue version = mime.Parameters.FirstOrDefault (v => v.Name.Equals ("Version", StringComparison.OrdinalIgnoreCase));

controllerVersion = "V" + versjon.Value.ToString ();

retur controllerVersjon;

                }

            }

returner "V1";

        }

Du kan påkalle Web API fra Fiddler ved å sende godkjenningshodet som vist nedenfor.

Godta: applikasjon / json; charset = utf-8; versjon = 2

Følgende kodeliste illustrerer hvordan du kan overstyre Velg kontroller for å velge en kontroller dynamisk. Legg merke til hvordan GetControllerVersionFromRequestHeader har blitt brukt. Hvis du vil hente kontrollerversjonen fra godkjenningshodet, bør du bruke GetControllerVersionFromAcceptHeader i stedet.

offentlig overstyring HttpControllerDescriptor SelectController (HttpRequestMessage-forespørsel)

        {

prøve

            {

streng controllerName = base.GetControllerName (forespørsel);

var controllers = GetControllerMapping ();

var routeData = request.GetRouteData ();

string controllerVersion = GetControllerVersionFromRequestHeader (forespørsel);

controllerName = String.Format ("{0} {1}", controllerName, controllerVersion);

HttpControllerDescriptor controllerDescriptor;

if (! controllers.TryGetValue (controllerName, out controllerDescriptor))

                {

string message = "Ingen HTTP-ressurs ble funnet som samsvarer med den angitte forespørsel URI {0}";

kaste nye HttpResponseException (forespørsel.CreateErrorResponse (System.Net.HttpStatusCode.NotFound, String.Format (melding, forespørsel.RequestUri)));

                }

retur controllerDescriptor;

            }

fangst (Unntak eks)

            {

kaste ny HttpResponseException (forespørsel.CreateErrorResponse (System.Net.HttpStatusCode.NotFound, String.Format (f.eks. Melding, forespørsel. RequestUri)));

            }

        }

Du bør legge til følgende linje i Register-metoden i WebApiConfig-klassen for å gi støtte for valg av kontroller ved kjøretid.

config.Services.Rlace (typeof (IHttpControllerSelector), new ControllerSelector ((config)));

Du kan nå bruke Fiddler til å teste web-API-et ditt - bruk komponistfanen til Fiddler og oppgi URL- og versjonsinformasjonen etter behov. Hvis du vil at versjon 2 av Web API-kontrolleren skal påberopes, bør du spesifisere Versjon: 2 når du skriver forespørselshodeinformasjonen i fanen Komponist i Fiddler.

$config[zx-auto] not found$config[zx-overlay] not found