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

Τρόπος μετάδοσης πολλαπλών παραμέτρων σε μεθόδους ελεγκτή API Ιστού

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

Το Web API παρέχει τις απαραίτητες μεθόδους δράσης για λειτουργίες HTTP GET, POST, PUT και DELETE. Συνήθως θα περάσατε ένα μόνο αντικείμενο ως παράμετρο στις μεθόδους δράσης PUT και POST. Σημειώστε ότι το Web API δεν υποστηρίζει τη μετάδοση πολλών παραμέτρων POST σε μεθόδους ελεγκτή API Web από προεπιλογή. Τι γίνεται όμως αν θέλατε να υποβάλετε ένα αίτημα POST με πολλαπλά αντικείμενα να περάσουν ως παράμετροι σε μια μέθοδο ελεγκτή API Ιστού;

Κατανόηση του προβλήματος

Το API Ιστού δεν σας επιτρέπει να μεταβιβάσετε πολλά σύνθετα αντικείμενα στην υπογραφή της μεθόδου μιας μεθόδου ελεγκτή API Ιστού - μπορείτε να δημοσιεύσετε μόνο μία τιμή σε μια μέθοδο δράσης API Ιστού. Αυτή η τιμή μπορεί με τη σειρά της να είναι ένα πολύπλοκο αντικείμενο. Είναι δυνατή η μετάδοση πολλαπλών τιμών σε λειτουργία POST ή PUT, αντιστοιχίζοντας μια παράμετρο στο πραγματικό περιεχόμενο και τις υπόλοιπες μέσω συμβολοσειρών ερωτημάτων.

Η ακόλουθη κλάση ελεγκτή περιέχει μια μέθοδο POST με το όνομα Αποθήκευση που δέχεται πολλές παραμέτρους.

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

    {

[HttpPost]

δημόσια HttpResponseMessage Save (int Id, string FirstName, string LastName, string Address)

        {

// Συνήθης κωδικός

επιστροφή Request.CreateResponse (HttpStatusCode.OK, "Success ...");

        }

   }

Ας υποθέσουμε ότι προσπαθείτε να καλέσετε τη μέθοδο ελεγκτή API Ιστού από το JQuery όπως φαίνεται παρακάτω.

$ .ajax ({

url: 'api / συγγραφείς',

πληκτρολογήστε: "POST",

δεδομένα: {Id: 1, Όνομα: 'Joydip', Επώνυμο: 'Kanjilal', Διεύθυνση: 'Hyderabad'},

Τύπος δεδομένων: «json»,

επιτυχία: λειτουργία (δεδομένα) {

προειδοποίηση (δεδομένα)

}});

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

[HttpPost]

δημόσιο HttpResponseMessage PostAuthor (Συγγραφέας συγγραφέα, συμβολοσειρά ελέγχου ταυτότητας)

{

// Συνήθης κωδικός

επιστροφή Request.CreateResponse (HttpStatusCode.OK, "Success ...");

}

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

Και τώρα, η λύση

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

$ .ajax ({

url: 'api / author? authenticationToken = abcxyz',

πληκτρολογήστε: "POST",

δεδομένα: JSON.stringify (συγγραφέας),

Τύπος δεδομένων: «json»,

επιτυχία: λειτουργία (δεδομένα) {

προειδοποίηση (δεδομένα)

}});

Θα πρέπει να τροποποιήσετε τη μέθοδο ελεγκτή API Ιστού σας για να αναλύσετε τη συμβολοσειρά ερωτήματος όπως φαίνεται παρακάτω.

[HttpPost]

δημόσιο HttpResponseMessage PostAuthor (Συγγραφέας)

{

var data = Request.RequestUri.ParseQueryString ();

κριτήρια κριτηρίου = queryItems ["authenticationToken"];

// Συνήθης κωδικός για την αποθήκευση δεδομένων στη βάση δεδομένων

επιστροφή Request.CreateResponse (HttpStatusCode.OK, "Success ...");

}

Λοιπόν, αλλά τι γίνεται αν έχετε πολλά σύνθετα αντικείμενα που θα μεταβιβαστούν ως παράμετροι στη μέθοδο ελεγκτή API Ιστού; Μπορείτε να δημιουργήσετε ένα μεμονωμένο αντικείμενο που περιβάλλει τις πολλαπλές παραμέτρους. Ανατρέξτε στην τάξη AuthorRequest που δίνεται παρακάτω.

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

   {

δημόσιος συγγραφέας Συγγραφέας {get; σειρά; }

δημόσια συμβολοσειρά Token {get; σειρά; }

   }

Βασικά, μπορείτε να τυλίξετε πολλές παραμέτρους σε μία κλάση και να χρησιμοποιήσετε αυτήν την κλάση ως παράμετρος στη μέθοδο ελεγκτή API Ιστού σας.

Εδώ είναι η ενημερωμένη μέθοδος ελεγκτή API Ιστού.

[HttpPost]

δημόσιο HttpResponseMessage PostAuthor (Αίτημα AuthorRequest)

  {

var author = request.Author;

var token = request.Token;

// Συνήθης κωδικός για την αποθήκευση δεδομένων στη βάση δεδομένων

επιστροφή Request.CreateResponse (HttpStatusCode.OK, "Success ...");

  }

Μπορείτε επίσης να χρησιμοποιήσετε το JObject για την ανάλυση πολλαπλών τιμών παραμέτρων από ένα αντικείμενο.

[HttpPost]

δημόσιο HttpResponseMessage PostAuthor (JObject jsonData)

{

δυναμικό json = jsonData;

JObject jauthor = json. Συγγραφέας;

συμβολική συμβολοσειρά = json.Token;

var author = jauthor.ToObject ();

// Συνήθης κωδικός για την αποθήκευση δεδομένων στη βάση δεδομένων

επιστροφή Request.CreateResponse (HttpStatusCode.OK, "Success ...");

}

Ένας άλλος τρόπος για να το λύσετε είναι με τη χρήση του FormDataCollection. Παρεμπιπτόντως, το FormDataCollection είναι μια συλλογή ζεύγους κλειδιών / τιμών όπως η FormCollection στο MVC.

[HttpPost]

δημόσιο HttpResponseMessage PostAuthor (φόρμα FormDataCollection)

        {

var author = form.Get ("Συγγραφέας");

var token = form.Get ("Token");

// Συνήθης κωδικός για την αποθήκευση δεδομένων στη βάση δεδομένων

επιστροφή Request.CreateResponse (HttpStatusCode.OK, "Success ...");

        }

Χάρη στην επεκτασιμότητα του πλαισίου Web API, μπορείτε επίσης να δημιουργήσετε το δικό σας προσαρμοσμένο δέσιμο παραμέτρων επεκτείνοντας την κλάση HttpParameterBinding για να παρέχετε υποστήριξη για δέσμευση πολλαπλών παραμέτρων.

Πώς να κάνετε περισσότερα στα ASP.NET και ASP.NET Core:

  • Τρόπος χρήσης της προσωρινής αποθήκευσης στη μνήμη στο ASP.NET Core
  • Πώς να χειριστείτε σφάλματα στο ASP.NET Web API
  • Τρόπος μετάδοσης πολλαπλών παραμέτρων σε μεθόδους ελεγκτή API Ιστού
  • Τρόπος καταγραφής των μεταδεδομένων αιτήματος και απόκρισης στο ASP.NET Web API
  • Πώς να εργαστείτε με HttpModules στο ASP.NET
  • Προηγμένη έκδοση στο ASP.NET Core Web API
  • Πώς να χρησιμοποιήσετε την ένεση εξάρτησης στο ASP.NET Core
  • Πώς να εργαστείτε με συνεδρίες στο ASP.NET
  • Πώς να εργαστείτε με HTTPHandlers στο ASP.NET
  • Πώς να χρησιμοποιήσετε το IHostedService στο ASP.NET Core
  • Πώς να καταναλώσετε μια υπηρεσία WCF SOAP στο ASP.NET Core
  • Πώς να βελτιώσετε την απόδοση των εφαρμογών ASP.NET Core
  • Πώς να καταναλώσετε ένα ASP.NET Core Web API χρησιμοποιώντας το RestSharp
  • Πώς να εργαστείτε με τη σύνδεση στο ASP.NET Core
  • Πώς να χρησιμοποιήσετε το MediatR στο ASP.NET Core
  • Τρόπος εργασίας με την κατάσταση συνεδρίας στον ASP.NET Core
  • Πώς να χρησιμοποιήσετε το Nancy στο ASP.NET Core
  • Κατανοήστε τη δέσμευση παραμέτρων στο ASP.NET Web API
  • Πώς να ανεβάσετε αρχεία στο ASP.NET Core MVC
  • Τρόπος εφαρμογής του παγκόσμιου χειρισμού εξαιρέσεων στο ASP.NET Core Web API
  • Πώς να εφαρμόσετε ελέγχους υγείας στο ASP.NET Core
  • Βέλτιστες πρακτικές στην προσωρινή αποθήκευση στο ASP.NET
  • Πώς να χρησιμοποιήσετε τα μηνύματα Apache Kafka στο .NET
  • Πώς να ενεργοποιήσετε το CORS στο Web API σας
  • Πότε να χρησιμοποιήσετε το WebClient εναντίον HttpClient εναντίον HttpWebRequest
  • Πώς να εργαστείτε με το Redis Cache στο .NET
  • Πότε να χρησιμοποιήσετε το Task.WaitAll εναντίον Task.WhenAll στο .NET