Cara membuat versi API Web Anda

Anda harus selalu membuat versi API Web Anda sekaligus mempertahankan sebanyak mungkin URI yang sama. Bayangkan situasi di mana Anda memiliki API Web yang aktif dan berjalan dalam produksi dan digunakan oleh pengguna. Sekarang misalkan Anda membutuhkan lebih banyak fungsionalitas di Web API namun harus menjaga fungsionalitas yang ada tetap utuh. Anda mungkin memiliki beberapa pengguna yang masih membutuhkan API lama, sementara yang lain membutuhkan versi dengan fitur baru atau yang diperluas. Di sinilah tepatnya versi Web API datang untuk menyelamatkan.

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

  1. Gunakan URL: Informasi versi ditentukan di URL sebagai string kueri.
  2. Gunakan Header Permintaan Kustom: Informasi versi untuk pengontrol Anda ditentukan di header permintaan tanpa perlu perubahan apa pun di URL.
  3. Use Accept Headers: Accept headers umumnya menentukan jenis media dan pengkodean karakter. Anda dapat menyampaikan informasi versi untuk API Web Anda melalui header accept tanpa harus mengubah URL.

Membuat Versi Web API menggunakan URL

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

kelas publik AuthorsV1Controller: ApiController

    {

        [HttpGet]

        publik IEnumerable GetAuthors ()

        {

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

        }

    }

kelas publik AuthorsV2Controller: ApiController

    {

        [HttpGet]

        publik IEnumerable GetAuthors ()

        {

            kembalikan string baru [] {"Joydip Kanjilal, INDIA", "Gerben Wierda, Netherlands"};

        }

    }

Untuk menyederhanakan ilustrasi ini, saya telah memasukkan metode yang dinamai GetAuthors()di setiap pengontrol. Sementara GetAuthors()di AuthorsV1Controllerkembalian hanya nama pengarang, GetAuthors()di AuthorsV2Controller(versi baru) mengembalikan nama pengarang bersama dengan nama negara dimana pengarang tinggal.

Potongan kode berikut menunjukkan bagaimana dua pengontrol menggunakan metode Register WebApiConfigkelas.

config.Routes.MapHttpRoute (

                nama: "WebAPIV1",

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

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

            );

config.Routes.MapHttpRoute (

                nama: "WebAPIV2",

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

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

            );

Sekarang Anda dapat menjalankan metode API Web GetAuthorsmenggunakan URL berikut.

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

Membuat versi Web API menggunakan header permintaan

Anda juga dapat mengimplementasikan pembuatan versi Web API menggunakan header permintaan. Untuk mencapai hal ini, Anda perlu mengimplementasikan kelas khusus yang memperluas DefaultHttpControllerSelectorkelas tersebut, lalu menggantinya SelectControllerdi kelas khusus Anda. Perhatikan bahwa DefaultHttpControllerSelectorkelas mengimplementasikan IHttpControllerSelectorantarmuka. SelectControllermemanggil secara GetControllerNameinternal dan menerima turunan dari HttpRequestMessagesebagai parameter.

Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat mengambil informasi versi dari header permintaan.

string pribadi GetControllerVersionFromRequestHeader (permintaan HttpRequestMessage)

        {

            var acceptHeader = request.Headers.Accept;

            const string headerName = "Versi";

            string controllerVersion = string.Empty;

            if (request.Headers.Contains (headerName))

            {

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

            }

            return controllerVersion;

        }

Membuat versi Web API menggunakan header terima

Metode berikut ini menunjukkan bagaimana Anda bisa mengambil informasi versi untuk API Web Anda dari header accept. Metode ini memeriksa tipe MIME dan mengembalikan informasi versi dengan tepat. Jika jenis media tidak application/json, versi default 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)));

Sekarang Anda dapat menggunakan Fiddler untuk menguji API Web Anda - gunakan tab komposer Fiddler dan berikan informasi URL dan versi yang sesuai. Jika Anda ingin versi 2 dari pengontrol API Web Anda dipanggil, Anda harus menentukan Version: 2saat membuat informasi header permintaan di tab Composer di Fiddler.