Cara membuat versi API Web anda

Anda harus selalu membuat versi Web API anda dan pada masa yang sama menyimpan sebanyak mungkin URI yang sama. Bayangkan situasi di mana anda mempunyai API Web yang sedang beroperasi dan sedang digunakan oleh pengguna. Sekarang andaikan anda memerlukan lebih banyak fungsi dalam Web API namun mesti memastikan fungsi yang ada tetap utuh. Anda mungkin mempunyai beberapa pengguna yang masih memerlukan API lama, sementara yang lain memerlukan versi dengan ciri baru atau diperluas. Ini betul-betul di mana versi API Web untuk menyelamatkan.

Anda boleh membuat versi Web API dengan salah satu cara berikut:

  1. Gunakan URL: Maklumat versi ditentukan dalam URL sebagai rentetan pertanyaan.
  2. Gunakan Header Permintaan Kustom: Maklumat versi untuk pengawal anda ditentukan dalam header permintaan tanpa memerlukan perubahan dalam URL.
  3. Gunakan Accept Headers: Accept header umumnya menentukan jenis media dan pengekodan watak. Anda boleh menyampaikan maklumat versi untuk API Web anda melalui tajuk penerimaan tanpa perlu mengubah URL.

Versi Web API menggunakan URL

Pertimbangkan pengawal API Web berikut, yang telah diberi nama  AuthorsV1Controllerdan AuthorsV2Controllermasing - masing.

kelas awam PengarangV1Controller: ApiController

    {

        [HttpGet]

        awamAEnumerable GetAuthors ()

        {

          kembalikan rentetan baru [] {"Joydip Kanjilal", "Gerben Wierda"};

        }

    }

kelas awam AuthorsV2Controller: ApiController

    {

        [HttpGet]

        awamAEnumerable GetAuthors ()

        {

            kembalikan rentetan baru [] {"Joydip Kanjilal, INDIA", "Gerben Wierda, Belanda"};

        }

    }

Untuk mempermudah ilustrasi ini, saya telah memasukkan kaedah yang dinamakan GetAuthors()di setiap pengawal. Sementara GetAuthors()dalam AuthorsV1Controllerpengembalian hanya nama pengarang, GetAuthors()dalam AuthorsV2Controller(versi baru) mengembalikan nama pengarang bersama dengan nama negara di mana pengarang tinggal.

Coretan kod berikut menunjukkan bagaimana kedua-dua pengawal menggunakan kaedah Daftar WebApiConfigkelas.

config.Routes.MapHttpRoute (

                nama: "WebAPIV1",

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

                lalai: baru {controller = "AuthorsV1Controller", action = "GetAuthors", id = RouteParameter.Optional}

            );

config.Routes.MapHttpRoute (

                nama: "WebAPIV2",

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

                lalai: baru {controller = "AuthorsV2Controller", action = "GetAuthors", id = RouteParameter.Optional}

            );

Anda kini boleh menggunakan kaedah API Web GetAuthorsmenggunakan URL berikut.

// localhost / WebAPI / api / v1 / Pengarang / GetAuthors

Versi Web API menggunakan tajuk permintaan

Anda juga dapat menerapkan versi API Web menggunakan header permintaan. Untuk mencapainya, anda perlu menerapkan kelas khusus yang memperluas DefaultHttpControllerSelectorkelas, kemudian ganti SelectControllerdi kelas khusus anda. Perhatikan bahawa DefaultHttpControllerSelectorkelas menggunakan IHttpControllerSelectorantara muka. SelectControllermemanggil secara GetControllerNamedalaman dan menerima contoh HttpRequestMessagesebagai parameter.

Coretan kod berikut menggambarkan bagaimana anda dapat mengambil maklumat versi dari tajuk permintaan.

rentetan peribadi GetControllerVersionFromRequestHeader (permintaan HttpRequestMessage)

        {

            var acceptHeader = request.Headers.Accept;

            const string headerName = "Versi";

            string controllerVersion = string.Kosong;

            jika (request.Headers.Contains (headerName))

            {

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

            }

            pengawal pemulanganVersion;

        }

Versi Web API menggunakan header accept

Kaedah berikut menunjukkan bagaimana anda dapat mengambil maklumat versi untuk API Web anda dari tajuk penerimaan. Kaedah ini memeriksa jenis MIME dan mengembalikan maklumat versi dengan tepat. Sekiranya jenis media tidak application/json, versi lalai dikembalikan sebagai V1.

private string GetControllerVersionFromAcceptHeader(HttpRequestMessage request)

        {

            var acceptHeader = request.Headers.Accept;

            string controllerVersion = string.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" + version.Value.ToString();

                    return controllerVersion;

                }

            }

            return "V1";

        }

You can invoke your Web API from Fiddler by passing the accept header as shown below.

Accept: application/json; charset=utf-8;version=2

The following code listing illustrates how you can override SelectController to select a controller dynamically. Note how GetControllerVersionFromRequestHeader has been used. If you would like to retrieve the controller version from the accept header, you should leverage GetControllerVersionFromAcceptHeader instead.

public override HttpControllerDescriptor SelectController(HttpRequestMessage request)

        {

            try

            {

                string controllerName = base.GetControllerName(request);

                var controllers = GetControllerMapping();

                var routeData = request.GetRouteData();

                string controllerVersion = GetControllerVersionFromRequestHeader(request);             

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

                HttpControllerDescriptor controllerDescriptor;

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

                {

                    string message = "No HTTP resource was found that matches the specified request URI {0}";

                    throw new HttpResponseException(request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, String.Format(message, request.RequestUri)));

                }

                return controllerDescriptor;

            }

            catch (Exception ex)

            {

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

            }

        }

You should add the following line in the Register method of the WebApiConfig class to provide support for controller selection at runtime.

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

Anda kini boleh menggunakan Fiddler untuk menguji API Web anda - gunakan tab penggubah Fiddler dan berikan maklumat URL dan versi yang sesuai. Sekiranya anda mahu versi 2 pengawal API Web anda dipanggil, anda harus menentukan Version: 2semasa menyusun maklumat tajuk permintaan di tab Komposer di Fiddler.