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

Κατανοήστε τη δέσμευση παραμέτρων στο ASP.Net Web API

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

Σημειώστε ότι υπάρχουν δύο τρόποι με τους οποίους το Web API μπορεί να δεσμεύσει παραμέτρους: δέσμευση μοντέλου και μορφοποιητές. Η δέσμευση μοντέλου χρησιμοποιείται για την ανάγνωση από τη συμβολοσειρά ερωτήματος, ενώ οι μορφοποιητές χρησιμοποιούνται για ανάγνωση από το σώμα αιτήματος. Μπορείτε επίσης να χρησιμοποιήσετε μετατροπείς τύπου για να επιτρέψετε στο Web API να αντιμετωπίζει μια κλάση ως απλό τύπο και, στη συνέχεια, να δεσμεύει την παράμετρο από το URI Για να το κάνετε αυτό, θα πρέπει να δημιουργήσετε έναν προσαρμοσμένο TypeConverter. Μπορείτε επίσης να δημιουργήσετε ένα προσαρμοσμένο μοντέλο συνδετήρα εφαρμόζοντας τη διεπαφή IModelBinder στην τάξη σας και στη συνέχεια εφαρμόζοντας τη μέθοδο BindModel. Για περισσότερα σχετικά με τους μετατροπείς τύπου και τα συνδετικά μοντέλων, ρίξτε μια ματιά σε αυτήν την τεκμηρίωση της Microsoft.

Τώρα, προκειμένου να δεσμεύσει παραμέτρους, το Web API ακολουθεί αυτόν τον κανόνα: Για απλούς τύπους, το Web API προσπαθεί να πάρει την τιμή από το URI και για σύνθετους τύπους, το Web API προσπαθεί να πάρει την τιμή από το σώμα του αιτήματος. Οι απλοί τύποι εδώ αναφέρονται τόσο στους πρωτόγονους τύπους .Net, int, bool, double, float κ.ο.κ. και σε άλλους τύπους που περιλαμβάνουν TimeSpan, DateTime, Guid, δεκαδικό και string. Περιλαμβάνει επίσης οποιονδήποτε τύπο για τον οποίο είναι διαθέσιμος ένας μετατροπέας τύπου που μπορεί να μετατρέψει από μια συμβολοσειρά. Στην επόμενη ενότητα θα διερευνήσουμε τα χαρακτηριστικά [FromBody] και [FromUri] που χρησιμοποιούνται για τη σύνδεση τιμών από το σώμα αιτήματος και το URI αντίστοιχα.

Πότε να χρησιμοποιήσετε το [FromBody] και το [FromUri] στο Web API

Εάν χρησιμοποιείτε κάποιο API Ιστού για κάποιο χρονικό διάστημα, ίσως γνωρίζετε τα χαρακτηριστικά [FromBody] και [FromUri]. Το χαρακτηριστικό [FromUri] προτίθεται στην παράμετρο για να καθορίσει ότι η τιμή πρέπει να διαβάζεται από το URI του αιτήματος και το χαρακτηριστικό [FromBody] χρησιμοποιείται για να καθορίσει ότι η τιμή πρέπει να διαβάζεται από το σώμα του αιτήματος.

Για όλους τους πρωτόγονους τύπους (int, double, float, κ.λπ.), ο χρόνος εκτέλεσης του Web API προσπαθεί να διαβάσει την τιμή από το URI του αιτήματος HTTP. Για σύνθετους τύπους (εμφανίσεις τάξεων), ο χρόνος εκτέλεσης του Web API προσπαθεί να διαβάσει την τιμή από το κύριο μέρος του αιτήματος HTTP χρησιμοποιώντας ένα μορφοποιητή τύπου μέσου. Αυτή είναι η προεπιλεγμένη συμπεριφορά του Web API.

Επομένως, εάν έχετε μια τιμή στο αίτημα URI που είναι πρωτόγονος τύπος, δεν χρειάζεται να καθορίσετε το χαρακτηριστικό [FromUri]. Παρομοίως, εάν έχετε μια τιμή στο σώμα αιτήματος που είναι σύνθετος τύπος, δεν χρειάζεται να καθορίσετε το χαρακτηριστικό [FromBody]. Ωστόσο, εάν ο πρωτόγονος τύπος βρίσκεται στο σώμα αιτήματος ή ο σύνθετος τύπος βρίσκεται στο URI αιτήματος, πρέπει να καθορίσετε το χαρακτηριστικό [FromBody] ή το [FromUri]. Ο λόγος είναι ότι απομακρύνεστε από την προεπιλεγμένη συμπεριφορά και στις δύο περιπτώσεις.

Τρόπος χρήσης των [FromBody] και [FromUri] στο Web API

Το παρακάτω απόσπασμα κώδικα απεικονίζει πώς μπορείτε να καθορίσετε το χαρακτηριστικό [FromBody] για έναν βασικό τύπο δεδομένων που παρέχεται ως παράμετρος σε μια μέθοδο API Ιστού.

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

{

δημόσια δημοσίευση HttpResponseMessage ([FromBody] int id)

    {

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

    }

}

Ακολουθεί ένα απόσπασμα κώδικα που δείχνει πώς μπορείτε να μεταβιβάσετε έναν σύνθετο τύπο ως παράμετρο σε μια μέθοδο API Ιστού χρησιμοποιώντας το χαρακτηριστικό FromUri.

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

{

δημόσια HttpResponseMessage Post ([FromUri] Χρήστης χρήστη)

    {

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

    }

}

Θα πρέπει να σημειωθεί ότι η αποστολή δεδομένων ελέγχου ταυτότητας χρήστη όπως το όνομα χρήστη και ο κωδικός πρόσβασης μέσω του URI δεν είναι καλή πρακτική, ακόμα κι αν χρησιμοποιείτε SSL. Αυτό συμβαίνει επειδή τέτοια δεδομένα ενδέχεται να αποθηκευτούν στα αρχεία καταγραφής του προγράμματος περιήγησης, όπου είναι ευάλωτα στην έκθεση. Κατά τη διαβίβαση ευαίσθητων δεδομένων (ονόματα χρήστη, κωδικοί πρόσβασης, πληροφορίες πιστωτικής κάρτας κ.λπ.) μέσω του σώματος αιτήματος, είναι απαραίτητο να χρησιμοποιείτε το [FromBody] σε κάθε περίπτωση.

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