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

Πώς να εργαστείτε με τη διαπραγμάτευση περιεχομένου στο Web API

Το ASP.Net Web API είναι ένα ελαφρύ πλαίσιο που χρησιμοποιείται για τη δημιουργία υπηρεσιών HTTP χωρίς κατάσταση και RESTful. Οι υπηρεσίες RESTful είναι ελαφριές, απάτριδες, βασισμένες στον πελάτη-διακομιστή, κρυφές μνήμες υπηρεσίες που βασίζονται στην έννοια των πόρων. Το REST είναι ένα αρχιτεκτονικό στιλ - ένα σύνολο περιορισμών που χρησιμοποιούνται για την εφαρμογή υπηρεσιών χωρίς κατάσταση. Πρόκειται για ένα αρχιτεκτονικό παράδειγμα που χρησιμοποιείται για τη δημιουργία επαναχρησιμοποιήσιμων, επεκτάσιμων υπηρεσιών.

Η αναπαράσταση ενός πόρου στη μορφή που ζητήθηκε είναι ένα ενδιαφέρον θέμα, καθώς ίσως συχνά θέλετε να καταναλώσετε τις υπηρεσίες σας από διάφορους τύπους συσκευών. Η διαπραγμάτευση περιεχομένου είναι μια από τις πιο σημαντικές έννοιες στο Web API. Αν και μια σχετικά απλή ιδέα, υπάρχουν πολλές παρανοήσεις και παρεξηγήσεις γύρω από αυτό το θέμα. Όταν σχεδιάζετε και εφαρμόζετε υπηρεσίες RESTful χρησιμοποιώντας το Web API, συχνά θα πρέπει να ασχοληθείτε με τη διαπραγμάτευση περιεχομένου.

Τι είναι το περιεχόμενο με διαπραγμάτευση και γιατί είναι σημαντικό;

Η διαπραγμάτευση περιεχομένου μπορεί να οριστεί ως η διαδικασία επιθεώρησης της δομής μιας εισερχόμενης αίτησης HTTP για τον προσδιορισμό της βέλτιστης αναπαράστασης ενός πόρου από πολλές διαθέσιμες αναπαραστάσεις του ίδιου πόρου. Στην ουσία, η διαπραγμάτευση περιεχομένου είναι μια ιδέα που επιτρέπει στο ίδιο URL να προβάλλει το ίδιο περιεχόμενο σε διάφορες μορφές. Μπορείτε να επωφεληθείτε από τη διαπραγμάτευση περιεχομένου για να επιλέξετε τον προτιμώμενο τύπο πολυμέσων.

Στο Web API, η διαπραγμάτευση περιεχομένου πραγματοποιείται από το χρόνο εκτέλεσης (στην πλευρά του διακομιστή) για να προσδιοριστεί ο τύπος μορφοποίησης μέσων που θα χρησιμοποιηθεί με βάση την επιστροφή της απόκρισης για ένα εισερχόμενο αίτημα από την πλευρά του πελάτη.

Η διαπραγμάτευση περιεχομένου επικεντρώνεται στον τύπο πολυμέσων και στον τύπο μορφοποίησης μέσων. Ενώ η πρώτη αναφέρεται στην τιμή της κεφαλίδας "τύπος περιεχομένου" στο αίτημα HTTP και στην απόκριση HTTP, η τελευταία χρησιμοποιείται για τη μετατροπή τύπων .NET σε αντίστοιχα δεδομένα HTTP και αντίστροφα. Σημειώστε ότι το μορφοποιητή τύπου πολυμέσων στο Web API αντιπροσωπεύεται από μια αφηρημένη κλάση που ονομάζεται MediaTypeFormatter.

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

  • System.Net.Http.Formatting.JsonMediaTypeFormatter
  • System.Net.Http.Formatting.XmlMediaTypeFormatter
  • System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
  • System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter

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

  • QueryStringMapping
  • UriPathExtensionMapping
  • RequestHeaderMapping
  • Χαρτογράφηση MediaRange

Για να δημιουργήσετε την προσαρμοσμένη αντιστοίχιση τύπου πολυμέσων, θα πρέπει να δημιουργήσετε μια κλάση που επεκτείνει το MediaTypeMapping, όπως φαίνεται στο απόσπασμα κώδικα παρακάτω.

δημόσια τάξη MediaTypeMapping: MediaTypeMapping

{

προστατευμένη παράκαμψη διπλού On TryMatchMediaType (Απόκριση HttpResponseMessage)

     {

// Γράψτε τον προσαρμοσμένο κωδικό σας εδώ

     }

}

Το ακόλουθο απόσπασμα κώδικα δείχνει πώς μπορείτε να ανακτήσετε τα ονόματα όλων των υποστηριζόμενων μορφοποιητών στο Web API επαναλαμβάνοντας τη συλλογή HttpConfiguration.Formatters.

   [HttpGet]

δημόσια λίστα GetAllFormatters ()

       {

Λίστα lstFormaters = νέα λίστα ();

foreach (var formatter σε αυτό. Configuration.Formatters)

           {

lstFormaters.Add (formatter.GetType (). Όνομα);

           }

επιστροφή lstFormaters;

       }

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

δημόσια τάξη CustomerDTO

   {

δημόσιο αναγνωριστικό Int32

{πάρει; σειρά; }

δημόσια συμβολοσειρά FirstName

{πάρει; σειρά; }

δημόσια συμβολοσειρά LastName

{πάρει; σειρά; }

δημόσια συμβολοσειρά Διεύθυνση

{πάρει; σειρά; }

   }

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

ιδιωτική λίστα GetCustomerData ()

       {

Λίστα lstCustomers = νέα λίστα ();

CustomerDTO πελάτη = νέο CustomerDTO ();

πελάτης.Id = 1;

customer.FirstName = "Joydip";

customer.LastName = "Kanjilal";

customer.Address = "Χαϊντεραμπάντ, Ινδία";

lstCustomers.Add (πελάτης);

επιστροφή lstCustomers;

       }

Η ακόλουθη μέθοδο Web API δείχνει πώς μπορείτε να επιστρέψετε το HttpResponseMessage ως απόκριση από τη μέθοδο Web API βάσει του προεπιλεγμένου διαθέσιμου μηχανισμού διαπραγμάτευσης περιεχομένου.

[HttpGet]

δημόσιο HttpResponseMessage GetCustomers ()

       {

Λίστα lstCustomers = GetCustomerData ();

IContentNegotiator διαπραγματευτής = Configuration.Services.GetContentNegotiator ();

ContentNegotiationResult result = διαπραγματευτής. Διαπραγμάτευση (typeof (CustomerDTO), Request, Configuration.Formatters);

επιστροφή νέου HttpResponseMessage ()

           {

Περιεχόμενο = νέο ObjectContent(lstCustomers, result.Formatter, result.MediaType.MediaType)

         };

       }

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

[HttpGet]

δημόσιο HttpResponseMessage GetCustomers ()

       {

Λίστα lstCustomers = GetCustomerData ();

επιστροφή νέου HttpResponseMessage ()

           {

Περιεχόμενο = νέο ObjectContent(lstCustomers, Configuration.Formatters [1])

           };

      }

Εντάξει; αλλά πώς δημιουργείτε το δικό σας προσαρμοσμένο μορφοποιητή τότε; Λοιπόν, για να δημιουργήσετε έναν προσαρμοσμένο τύπο μορφοποιητή μέσων, θα πρέπει να δημιουργήσετε μια κλάση που επεκτείνει την αφηρημένη κλάση MediaTypeFormatter. Στη συνέχεια, πρέπει να γράψετε τον προσαρμοσμένο κωδικό σας μέσα στην κλάση που δημιουργήσατε για να παρακάμψετε τις μεθόδους της κατηγορίας αφηρημένης βάσης MediaTypeFormatter.

δημόσια τάξη CustomMediaTypeFormatter: MediaTypeFormatter

   {

δημόσια παράκαμψη bool CanReadType (τύπος τύπου)

       {

ρίξτε νέο NotImplementedException ();

       }

δημόσια παράκαμψη bool CanWriteType (Τύπος τύπου)

       {

ρίξτε νέο NotImplementedException ();

       }

   }

Μόλις ο προσαρμοστής μορφοποίησης είναι στη θέση του, μπορείτε να τον προσθέσετε εύκολα στη συλλογή μορφοποιητών:

config.Formatters.Add (νέο CustomMediaTypeFormatter ());