Προγραμματισμός

Πώς να εκδώσετε το Web API σας

Πρέπει πάντα να εκδίδετε το Web API σας, ενώ ταυτόχρονα να διατηρείτε όσο το δυνατόν περισσότερα από το ίδιο URI. Φανταστείτε μια κατάσταση όπου διαθέτετε ένα Web API που λειτουργεί και λειτουργεί και καταναλώνεται από τους χρήστες. Ας υποθέσουμε τώρα ότι χρειάζεστε περισσότερη λειτουργικότητα στο Web API, αλλά πρέπει να διατηρήσετε την υπάρχουσα λειτουργικότητα ανέπαφη. Μπορεί να έχετε μερικούς χρήστες που εξακολουθούν να χρειάζονται το παλιό API, ενώ άλλοι θα χρειαστούν μια έκδοση με νέες ή εκτεταμένες δυνατότητες. Σε αυτό ακριβώς το σημείο διατίθεται η έκδοση API του Web.

Μπορείτε να εκδώσετε το Web API σας με έναν από τους ακόλουθους τρόπους:

  1. Χρήση διευθύνσεων URL: Οι πληροφορίες έκδοσης καθορίζονται στη διεύθυνση URL ως συμβολοσειρά ερωτήματος.
  2. Χρήση κεφαλίδων προσαρμοσμένου αιτήματος: Οι πληροφορίες έκδοσης για τον ελεγκτή σας καθορίζονται στην κεφαλίδα αιτήματος και δεν χρειάζεται να γίνουν αλλαγές στη διεύθυνση URL.
  3. Χρήση κεφαλίδων αποδοχής: Οι κεφαλίδες αποδοχής καθορίζουν γενικά τον τύπο μέσου και τις κωδικοποιήσεις χαρακτήρων. Μπορείτε να μεταβιβάσετε πληροφορίες έκδοσης για το API Ιστού σας μέσω κεφαλίδων αποδοχής χωρίς να χρειάζεται να αλλάξετε τη διεύθυνση URL.

Έκδοση API Ιστού χρησιμοποιώντας URL

Εξετάστε τους ακόλουθους ελεγκτές API Ιστού, που έχουν ονομαστείΣυγγραφέαςV1Controller και ΣυγγραφέαςV2Controller αντίστοιχα.

δημόσια τάξη AuthorsV1Controller: ApiController

    {

[HttpGet]

δημόσια IEnumerable GetAuthors ()

        {

επιστροφή νέας συμβολοσειράς [] {"Joydip Kanjilal", "Gerben Wierda"};

        }

    }

δημόσια τάξη AuthorsV2Controller: ApiController

    {

[HttpGet]

δημόσια IEnumerable GetAuthors ()

        {

επιστροφή νέας συμβολοσειράς [] {"Joydip Kanjilal, INDIA", "Gerben Wierda, Netherlands"};

        }

    }

Για να απλοποιήσω αυτήν την εικόνα, έχω ενσωματώσει μια μέθοδο που ονομάζεται GetAuthors () σε κάθε ελεγκτή. Ενώ GetAuthors () σε ΣυγγραφέαςV1Controller επιστρέφει μόνο τα ονόματα των συγγραφέων, GetAuthors () σε ΣυγγραφέαςV2Controller (η νέα έκδοση) επιστρέφει τα ονόματα των συγγραφέων μαζί με τα ονόματα των χωρών στις οποίες διαμένουν οι συγγραφείς.

Το παρακάτω απόσπασμα κώδικα δείχνει τον τρόπο με τον οποίο οι δύο ελεγκτές χρησιμοποιούν τη μέθοδο καταχώρησης του WebApiConfig τάξη.

config.Routes.MapHttpRoute (

όνομα: "WebAPIV1",

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

προεπιλογές: νέο {controller = "AuthorsV1Controller", action = "GetAuthors", id = RouteParameter.Optional}

            );

config.Routes.MapHttpRoute (

όνομα: "WebAPIV2",

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

προεπιλογές: νέο {controller = "AuthorsV2Controller", action = "GetAuthors", id = RouteParameter.Optional}

            );

Τώρα μπορείτε να καλέσετε τη μέθοδο Web API GetAuthors χρησιμοποιώντας την ακόλουθη διεύθυνση URL.

// localhost / WebAPI / api / v1 / Συγγραφείς / GetAuthors

Έκδοση Web API χρησιμοποιώντας την κεφαλίδα του αιτήματος

Μπορείτε επίσης να εφαρμόσετε εκδόσεις API Ιστού χρησιμοποιώντας την κεφαλίδα του αιτήματος. Για να επιτευχθεί αυτό, πρέπει να εφαρμόσετε μια προσαρμοσμένη κλάση που επεκτείνει το DefaultHttpControllerSelector τάξη και μετά παράκαμψη ΕπιλέξτεController στην προσαρμοσμένη τάξη σας. Σημειώστε ότι το DefaultHttpControllerSelector τάξη εφαρμόζει το IHttpControllerSelector διεπαφή.ΕπιλέξτεController κλήσεις GetControllerName εσωτερικά και δέχεται μια παρουσία του HttpRequestMessage ως παράμετρος.

Το ακόλουθο απόσπασμα κώδικα δείχνει πώς μπορείτε να ανακτήσετε πληροφορίες έκδοσης από την κεφαλίδα του αιτήματος.

ιδιωτική συμβολοσειρά GetControllerVersionFromRequestHeader (HttpRequestMessage request)

        {

var acceptHeader = request.Headers.Accept;

const string headerName = "Έκδοση";

string controllerVersion = string.Empty;

εάν (request.Headers.Contains (όνομα κεφαλίδας))

            {

controllerVersion = "V" + request.Headers.GetValues ​​(headerName). Πρώτα ();

            }

επιστροφή ελεγκτή Version;

        }

Versioning Web API χρησιμοποιώντας την κεφαλίδα αποδοχής

Η ακόλουθη μέθοδος δείχνει πώς μπορείτε να ανακτήσετε πληροφορίες έκδοσης για το Web API από την κεφαλίδα αποδοχής. Η μέθοδος ελέγχει τον τύπο MIME και επιστρέφει τις πληροφορίες έκδοσης κατάλληλα. Εάν ο τύπος μέσου δεν είναι εφαρμογή / json, η προεπιλεγμένη έκδοση επιστρέφεται ως V1.

ιδιωτική συμβολοσειρά GetControllerVersionFromAcceptHeader (HttpRequestMessage request)

        {

var acceptHeader = request.Headers.Accept;

string controllerVersion = string.Empty;

foreach (var mime στο acceptHeader)

            {

εάν (mime.MediaType.Equals ("application / json"))

                {

NameValueHeaderValue version = mime.Parameters.FirstOrDefault (v => v.Name.Equals ("Έκδοση", StringComparison.OrdinalIgnoreCase));

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

επιστροφή ελεγκτή Version;

                }

            }

επιστροφή "V1";

        }

Μπορείτε να καλέσετε το API Ιστού σας από το Fiddler περνώντας την κεφαλίδα αποδοχής όπως φαίνεται παρακάτω.

Αποδοχή: application / json; charset = utf-8; έκδοση = 2

Η ακόλουθη λίστα κωδικών δείχνει πώς μπορείτε να παρακάμψετε ΕπιλέξτεController για να επιλέξετε δυναμικά έναν ελεγκτή. Σημειώστε πώς GetControllerVersionFromRequestHeader έχει χρησιμοποιηθεί. Εάν θέλετε να ανακτήσετε την έκδοση του ελεγκτή από την κεφαλίδα αποδοχής, θα πρέπει να αξιοποιήσετε GetControllerVersionFromAcceptHeader αντι αυτου.

δημόσια παράκαμψη HttpControllerDescriptor SelectController (HttpRequestMessage request)

        {

δοκιμάστε

            {

string controllerName = base.GetControllerName (αίτημα);

var Controllers = GetControllerMapping ();

var routeData = request.GetRouteData ();

string controllerVersion = GetControllerVersionFromRequestHeader (αίτημα);

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

HttpControllerDescriptor controllerDescriptor;

εάν (! Controllers.TryGetValue (controllerName, out controllerDescriptor))

                {

string message = "Δεν βρέθηκε πόρος HTTP που να ταιριάζει με το καθορισμένο URI αιτήματος {0}";

ρίξτε νέο HttpResponseException (request.CreateErrorResponse (System.Net.HttpStatusCode.NotFound, String.Format (μήνυμα, request.RequestUri)));

                }

επιστροφή ελεγκτήDescriptor;

            }

αλίευση (πρώην εξαίρεση)

            {

ρίξτε νέο HttpResponseException (request.CreateErrorResponse (System.Net.HttpStatusCode.NotFound, String.Format (π.χ. Μήνυμα, request.RequestUri)));

            }

        }

Πρέπει να προσθέσετε την ακόλουθη γραμμή στη μέθοδο Register της κλάσης WebApiConfig για να παρέχετε υποστήριξη για την επιλογή ελεγκτή κατά το χρόνο εκτέλεσης.

config.Services.Replace (typeof (IHttpControllerSelector), νέο ControllerSelector ((config)));

Τώρα μπορείτε να χρησιμοποιήσετε το Fiddler για να δοκιμάσετε το Web API σας - χρησιμοποιήστε την καρτέλα συνθέτη του Fiddler και παρέχετε τις διευθύνσεις URL και τις πληροφορίες έκδοσης, ανάλογα με την περίπτωση. Εάν θέλετε να ενεργοποιηθεί η έκδοση 2 του ελεγκτή API Ιστού σας, θα πρέπει να καθορίσετε Έκδοση: 2 κατά τη σύνταξη των πληροφοριών κεφαλίδας αιτήματος στην καρτέλα Συνθέτης στο Fiddler.