Programiranje

Kako razložiti svoj spletni API

Vedno morate različico svojega spletnega API-ja obdržati, hkrati pa hraniti čim več istega URI-ja. Predstavljajte si situacijo, ko imate spletni API, ki deluje in deluje v produkciji in ga uporabniki uporabljajo. Zdaj predpostavimo, da potrebujete več funkcij v spletnem API-ju, vendar morate ohraniti obstoječo funkcionalnost nedotaknjeno. Morda imate nekaj uporabnikov, ki še vedno potrebujejo stari API, drugi pa bodo potrebovali različico z novimi ali razširjenimi funkcijami. Tukaj na pomoč priskoči različica spletnega API-ja.

Spletni API lahko razvejate na enega od naslednjih načinov:

  1. Uporabi URL-je: Podatki o različici so v URL-ju navedeni kot niz poizvedbe.
  2. Uporabite glave zahtev po meri: informacije o različici vašega krmilnika so določene v glavi zahteve, razen če je treba spremeniti URL.
  3. Uporabi Accept Headers: Accept headers na splošno določajo vrsto medija in kodiranje znakov. Informacije o različici spletnega API-ja lahko posredujete prek sprejemnih glav, ne da bi morali spremeniti URL.

Predelava spletnih API-jev z uporabo URL-jev

Upoštevajte naslednje krmilnike spletnega API-ja, ki so bili poimenovaniAvtorjiV1Controller in AvtorjiV2Controller oz.

javni razred AuthorsV1Controller: ApiController

    {

[HttpGet]

javni IEnumerable GetAuthors ()

        {

vrni nov niz [] {"Joydip Kanjilal", "Gerben Wierda"};

        }

    }

javni razred AuthorsV2Controller: ApiController

    {

[HttpGet]

javni IEnumerable GetAuthors ()

        {

vrni nov niz [] {"Joydip Kanjilal, INDIJA", "Gerben Wierda, Nizozemska"};

        }

    }

Za poenostavitev te ilustracije sem vključil metodo z imenom GetAuthors () v vsakem krmilniku. Medtem GetAuthors () v AvtorjiV1Controller vrne samo imena avtorjev, GetAuthors () v AvtorjiV2Controller (nova različica) vrne imena avtorjev skupaj z imeni držav, v katerih avtorji prebivajo.

Naslednji delček kode prikazuje, kako krmilnika uporabljata metodo Register v WebApiConfig razred.

config.Routes.MapHttpRoute (

ime: "WebAPIV1",

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

privzeto: novo {controller = "AuthorsV1Controller", action = "GetAuthors", id = RouteParameter.O optional}

            );

config.Routes.MapHttpRoute (

ime: "WebAPIV2",

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

privzeto: novo {controller = "AuthorsV2Controller", action = "GetAuthors", id = RouteParameter.O optional}

            );

Zdaj lahko prikličete metodo spletnega API-ja GetAuthors z uporabo naslednjega URL-ja.

// localhost / WebAPI / api / v1 / Authors / GetAuthors

Predelava spletnih API-jev z uporabo glave zahteve

Različice spletnega API-ja lahko implementirate tudi z glavo zahteve. Da bi to dosegli, morate implementirati razred po meri, ki razširja PrivzetiHttpControllerSelector razred, nato preglasite Izberite Controller v svojem razredu po meri. Upoštevajte, da PrivzetiHttpControllerSelector razred izvaja IHttpControllerSelector vmesnik.Izberite Controller klici GetControllerName interno in sprejme primerek HttpRequestMessage kot parameter.

Naslednji delček kode prikazuje, kako lahko iz glave zahteve pridobite informacije o različici.

zasebni niz GetControllerVersionFromRequestHeader (zahteva HttpRequestMessage)

        {

var acceptHeader = request.Headers.Accept;

const string headerName = "Različica";

string controllerVersion = string.Empty;

if (request.Headers.Contains (headerName))

            {

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

            }

return controllerVersion;

        }

Izdelava različic spletnega API-ja z uporabo sprejemne glave

Naslednja metoda prikazuje, kako lahko iz glave sprejema pridobite informacije o različici spletnega API-ja. Metoda preveri vrsto MIME in ustrezno vrne informacije o različici. Če vrsta medija ni application / json, privzeta različica se vrne kot V1.

zasebni niz GetControllerVersionFromAcceptHeader (zahteva HttpRequestMessage)

        {

var acceptHeader = request.Headers.Accept;

string controllerVersion = string.Empty;

foreach (var mime v acceptHeader)

            {

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

                {

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

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

return controllerVersion;

                }

            }

vrnitev "V1";

        }

Spletni API lahko prikličete iz Fiddlerja, tako da pošljete glavo sprejema, kot je prikazano spodaj.

Sprejmi: application / json; charset = utf-8; različica = 2

Naslednji seznam kod ponazarja, kako lahko preglasite Izberite Controller da dinamično izberete krmilnik. Upoštevajte, kako GetControllerVersionFromRequestHeader je bila uporabljena. Če želite različico krmilnika pridobiti iz glave za sprejem, uporabite vzvod GetControllerVersionFromAcceptHeader namesto tega.

javno preglasitev HttpControllerDescriptor SelectController (zahteva HttpRequestMessage)

        {

poskusite

            {

niz controllerName = base.GetControllerName (zahteva);

var controllers = GetControllerMapping ();

var routeData = request.GetRouteData ();

string controllerVersion = GetControllerVersionFromRequestHeader (zahteva);

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

HttpControllerDescriptor controllerDescriptor;

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

                {

string message = "Najden ni bil noben vir HTTP, ki bi se ujemal z navedenim URI zahteve {0}";

vrzi novo HttpResponseException (request.CreateErrorResponse (System.Net.HttpStatusCode.NotFound, String.Format (sporočilo, request.RequestUri)));

                }

vrnitev controllerDescriptor;

            }

ulov (izjema ex)

            {

vrzi nov HttpResponseException (request.CreateErrorResponse (System.Net.HttpStatusCode.NotFound, String.Format (ex.Message, request.RequestUri)));

            }

        }

V način registracije razreda WebApiConfig dodajte naslednjo vrstico, da zagotovite podporo za izbiro krmilnika med izvajanjem.

config.Services.Replace (typeof (IHttpControllerSelector), nov ControllerSelector ((config)));

Zdaj lahko s Fiddlerjem preizkusite svoj spletni API - uporabite zavihek za sestavljanje v Fiddlerju in po potrebi navedite podatke o URL-ju in različici. Če želite, da se prikliče različica 2 vašega krmilnika spletnega API-ja, morate to določiti Različica: 2 pri sestavljanju informacij o glavi zahteve na zavihku Sestavljalnik v Fiddlerju.

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