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:
- Uporabi URL-je: Podatki o različici so v URL-ju navedeni kot niz poizvedbe.
- Uporabite glave zahtev po meri: informacije o različici vašega krmilnika so določene v glavi zahteve, razen če je treba spremeniti URL.
- 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.