Programování

Jak vytvořit verzi webového rozhraní API

Měli byste vždy své webové rozhraní API aktualizovat a současně zachovat co nejvíce stejného URI, jak je to možné. Představte si situaci, kdy máte webové API, které je v provozu a běží ve výrobě a je spotřebováváno uživateli. Nyní předpokládejme, že potřebujete více funkcí ve webovém rozhraní API, ale musíte zachovat stávající funkce beze změny. Možná máte několik uživatelů, kteří stále potřebují staré API, zatímco ostatní budou potřebovat verzi s novými nebo rozšířenými funkcemi. To je přesně místo, kde dochází k záchraně verzí webového API.

Webové rozhraní API můžete verzovat jedním z následujících způsobů:

  1. Použít adresy URL: Informace o verzi jsou v adrese URL zadány jako řetězec dotazu.
  2. Použít vlastní záhlaví požadavku: Informace o verzi pro váš řadič jsou uvedeny v záhlaví požadavku bez nutnosti jakýchkoli změn v adrese URL.
  3. Použít Přijmout záhlaví: Přijmout záhlaví obecně definuje typ média a kódování znaků. Informace o verzi svého webového rozhraní API můžete předat prostřednictvím přijetí záhlaví, aniž byste museli měnit adresu URL.

Verze webového rozhraní API pomocí adres URL

Zvažte následující řadiče webového rozhraní API, které byly pojmenoványAuthorsV1Controller a AuthorsV2Controller resp.

veřejná třída AuthorsV1Controller: ApiController

    {

[HttpGet]

veřejné IEnumerable GetAuthors ()

        {

vrátit nový řetězec [] {"Joydip Kanjilal", "Gerben Wierda"};

        }

    }

veřejná třída AuthorsV2Controller: ApiController

    {

[HttpGet]

veřejné IEnumerable GetAuthors ()

        {

vrátit nový řetězec [] {"Joydip Kanjilal, INDIE", "Gerben Wierda, Nizozemsko"};

        }

    }

Pro zjednodušení této ilustrace jsem začlenil metodu s názvem GetAuthors () v každém řadiči. Zatímco GetAuthors () v AuthorsV1Controller vrací pouze jména autorů, GetAuthors () v AuthorsV2Controller (nová verze) vrátí jména autorů spolu se jmény zemí, ve kterých se autoři nacházejí.

Následující fragment kódu ukazuje, jak dva řadiče používají Register metodu WebApiConfig třída.

config.Routes.MapHttpRoute (

název: "WebAPIV1",

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

výchozí: nový {controller = "AuthorsV1Controller", action = "GetAuthors", id = RouteParameter.Optional}

            );

config.Routes.MapHttpRoute (

název: "WebAPIV2",

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

výchozí: nový {controller = "AuthorsV2Controller", action = "GetAuthors", id = RouteParameter.Optional}

            );

Nyní můžete vyvolat metodu webového rozhraní API GetAuthors pomocí následující adresy URL.

// localhost / WebAPI / api / v1 / Autoři / GetAuthors

Verze webového API pomocí záhlaví požadavku

Můžete také implementovat správu verzí webového rozhraní API pomocí záhlaví požadavku. Chcete-li toho dosáhnout, musíte implementovat vlastní třídu, která rozšiřuje DefaultHttpControllerSelector třídy, pak přepsat SelectController ve vaší vlastní třídě. Všimněte si, že DefaultHttpControllerSelector třída implementuje IHttpControllerSelector rozhraní.SelectController hovory GetControllerName interně a přijímá instanci HttpRequestMessage jako parametr.

Následující fragment kódu ukazuje, jak můžete načíst informace o verzi z hlavičky požadavku.

soukromý řetězec GetControllerVersionFromRequestHeader (požadavek HttpRequestMessage)

        {

var acceptHeader = request.Headers.Accept;

const řetězec headerName = "Verze";

string controllerVersion = string.Empty;

if (request.Headers.Contains (headerName))

            {

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

            }

return controllerVersion;

        }

Verze webového rozhraní API pomocí hlavičky Přijmout

Následující metoda ukazuje, jak můžete z hlavičky přijmout načíst informace o verzi pro vaše webové API. Metoda kontroluje typ MIME a odpovídajícím způsobem vrací informace o verzi. Pokud typ média není aplikace / JSON, výchozí verze je vrácena jako V1.

soukromý řetězec GetControllerVersionFromAcceptHeader (požadavek HttpRequestMessage)

        {

var acceptHeader = request.Headers.Accept;

string controllerVersion = string.Empty;

foreach (var mime v acceptHeader)

            {

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

                {

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

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

return controllerVersion;

                }

            }

návrat "V1";

        }

Webové rozhraní API můžete vyvolat z Fiddleru předáním hlavičky přijetí, jak je znázorněno níže.

Přijmout: application / json; charset = utf-8; verze = 2

Následující výpis kódu ukazuje, jak můžete přepsat SelectController dynamicky vybrat řadič. Všimněte si jak GetControllerVersionFromRequestHeader byl užíván. Pokud chcete načíst verzi ovladače z hlavičky přijetí, měli byste využít GetControllerVersionFromAcceptHeader namísto.

veřejné přepsání HttpControllerDescriptor SelectController (požadavek HttpRequestMessage)

        {

Snaž se

            {

řetězec controllerName = base.GetControllerName (požadavek);

var controllers = GetControllerMapping ();

var routeData = request.GetRouteData ();

string controllerVersion = GetControllerVersionFromRequestHeader (požadavek);

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

HttpControllerDescriptor controllerDescriptor;

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

                {

string message = "Nebyl nalezen žádný prostředek HTTP, který odpovídá zadanému identifikátoru URI požadavku {0}";

hodit novou HttpResponseException (request.CreateErrorResponse (System.Net.HttpStatusCode.NotFound, String.Format (zpráva, request.RequestUri)));

                }

návratový řadič Deskriptor;

            }

úlovek (výjimka mimo)

            {

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

            }

        }

Následující řádek byste měli přidat do metody Register třídy WebApiConfig, abyste poskytli podporu pro výběr řadiče za běhu.

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

Nyní můžete použít Fiddler k otestování vašeho webového API - použijte záložku Fiddler na kartě skladatel a podle potřeby uveďte informace o adrese URL a verzi. Pokud chcete, aby byla vyvolána verze 2 vašeho řadiče webového rozhraní API, měli byste zadat Verze: 2 při skládání informací záhlaví požadavku na kartě Skladatel v nástroji Fiddler.