Übergeben mehrerer Parameter an Web-API-Controller-Methoden

In einem früheren Beitrag hier haben wir die Parameterbindung in der Web-API untersucht. In diesem Beitrag erfahren Sie, wie Sie mehrere Parameter an Web-API-Controller-Methoden übergeben.

Die Web-API bietet die erforderlichen Aktionsmethoden für HTTP-Operationen GET, POST, PUT und DELETE. Normalerweise übergeben Sie ein einzelnes Objekt als Parameter an die Aktionsmethoden PUT und POST. Beachten Sie, dass die Web-API standardmäßig nicht die Übergabe mehrerer POST-Parameter an Web-API-Controller-Methoden unterstützt. Was aber, wenn Sie eine POST-Anforderung mit mehreren Objekten stellen, die als Parameter an eine Web-API-Controller-Methode übergeben werden?

Das Problem verstehen

Mit der Web-API können Sie nicht mehrere komplexe Objekte in der Methodensignatur einer Web-API-Controller-Methode übergeben. Sie können nur einen einzigen Wert an eine Web-API-Aktionsmethode senden. Dieser Wert kann sogar ein komplexes Objekt sein. Es ist möglich, mehrere Werte für eine POST- oder PUT-Operation zu übergeben, indem ein Parameter dem tatsächlichen Inhalt und die verbleibenden über Abfragezeichenfolgen zugeordnet werden.

Die folgende Controller-Klasse enthält eine POST-Methode namens Save, die mehrere Parameter akzeptiert.

öffentliche Klasse AuthorsController: ApiController

    {

        [HttpPost]

        public HttpResponseMessage Save (int ID, Zeichenfolge Vorname, Zeichenfolge Nachname, Zeichenfolge Adresse)

        {

            // Üblicher Code

            return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

        }}

   }}

Angenommen, Sie versuchen, die Web-API-Controller-Methode wie unten gezeigt von JQuery aus aufzurufen.

$ .ajax ({

 URL: 'API / Autoren',

 Typ: 'POST',

 Daten: {Id: 1, Vorname: 'Joydip', Nachname: 'Kanjilal', Adresse: 'Hyderabad'},

 Datentyp: 'json',

 Erfolg: Funktion (Daten) {

Alarm (Daten);

}});

Leider schlägt dieser Aufruf fehl, da diese Anforderung nicht von der Web-API verarbeitet werden kann. Wenn Sie über eine Web-API-Controller-Methode verfügen, die mehrere komplexe Objekte akzeptiert, können Sie diese Methode nicht direkt von einem Client aus aufrufen.

[HttpPost]

public HttpResponseMessage PostAuthor (Autor Autor, Zeichenfolge authenticationToken)

{

  // Üblicher Code

  return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

}}

Sie können Parameter mit den Attributen [FromBody] oder [FromUri] an Web-API-Controller-Methoden übergeben. Beachten Sie, dass das Attribut [FromBody] in der Parameterliste einer Methode nur einmal verwendet werden kann. Zur Wiederholung dürfen Sie nur einen Wert (einfachen oder komplexen Typ) als Parameter an eine Web-API-Controller-Methode übergeben, wenn Sie das Attribut [FromBody] verwenden. Sie können eine beliebige Anzahl von Parametern mit dem Attribut [FromUri] übergeben, dies ist jedoch in unserem Fall nicht die ideale Lösung.

Und jetzt die Lösung

Nachdem wir das Problem beim Übergeben von Parametern an eine Web-API-Controller-Methode verstanden haben, wollen wir die möglichen Lösungen untersuchen. Eine Möglichkeit, dies zu erreichen, besteht darin, das komplexe Objekt als [FromBody] -Attribut und den Zeichenfolgenparameter über den Uri zu übergeben, wie im folgenden Codeausschnitt gezeigt.

$ .ajax ({

 URL: 'API / Autoren? authenticationToken = abcxyz',

 Typ: 'POST',

  Daten: JSON.stringify (Autor),

 Datentyp: 'json',

 Erfolg: Funktion (Daten) {

   Alarm (Daten);

}});

Sie müssten Ihre Web-API-Controller-Methode entsprechend ändern, um die Abfragezeichenfolge wie unten gezeigt zu analysieren.

[HttpPost]

public HttpResponseMessage PostAuthor (Autor Autor)

{

  var data = Request.RequestUri.ParseQueryString ();

  Zeichenfolgenkriterien = queryItems ["authenticationToken"];

  // Üblicher Code zum Speichern von Daten in der Datenbank

  return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

}}

Nun, aber was ist, wenn Sie mehrere komplexe Objekte als Parameter an die Web-API-Controller-Methode übergeben müssen? Sie können ein einzelnes Objekt erstellen, das die mehreren Parameter umschließt. Weitere Informationen finden Sie in der unten angegebenen AuthorRequest-Klasse.

öffentliche Klasse AuthorRequest

   {

      öffentlicher Autor Autor {get; einstellen; }}

      öffentlicher String Token {get; einstellen; }}

   }}

Grundsätzlich können Sie mehrere Parameter in eine einzelne Klasse einschließen und diese Klasse als Parameter für Ihre Web-API-Controller-Methode verwenden.

Hier ist die aktualisierte Web-API-Controller-Methode.

[HttpPost]

public HttpResponseMessage PostAuthor (AuthorRequest-Anfrage)

  {

       var author = request.Author;

       var token = request.Token;

       // Üblicher Code zum Speichern von Daten in der Datenbank

       return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

  }}

Sie können JObject auch verwenden, um mehrere Parameterwerte aus einem Objekt heraus zu analysieren.

[HttpPost]

public HttpResponseMessage PostAuthor (JObject jsonData)

{

    dynamisches json = jsonData;

    JObject jauthor = json.Author;

    string token = json.Token;

    var author = jauthor.ToObject ();

    // Üblicher Code zum Speichern von Daten in der Datenbank

    return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

}}

Eine andere Möglichkeit, dies zu lösen, ist die Verwendung von FormDataCollection. FormDataCollection ist übrigens eine Schlüssel / Wert-Paar-Sammlung, ähnlich wie die FormCollection in MVC.

[HttpPost]

        public HttpResponseMessage PostAuthor (FormDataCollection-Formular)

        {

            var author = form.Get ("Autor");

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

            // Üblicher Code zum Speichern von Daten in der Datenbank

            return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

        }}

Dank der Erweiterbarkeit des Web-API-Frameworks können Sie auch Ihren eigenen benutzerdefinierten Parameterordner erstellen, indem Sie die HttpParameterBinding-Klasse erweitern, um die Bindung mehrerer Parameter zu unterstützen.

So machen Sie mehr in ASP.NET und ASP.NET Core:

  • Verwendung des In-Memory-Caching in ASP.NET Core
  • Behandlung von Fehlern in der ASP.NET-Web-API
  • Übergeben mehrerer Parameter an Web-API-Controller-Methoden
  • So protokollieren Sie Anforderungs- und Antwortmetadaten in der ASP.NET-Web-API
  • So arbeiten Sie mit HttpModules in ASP.NET
  • Erweiterte Versionierung in der ASP.NET Core-Web-API
  • Verwendung der Abhängigkeitsinjektion in ASP.NET Core
  • So arbeiten Sie mit Sitzungen in ASP.NET
  • So arbeiten Sie mit HTTPHandlern in ASP.NET
  • Verwendung von IHostedService in ASP.NET Core
  • So verwenden Sie einen WCF-SOAP-Dienst in ASP.NET Core
  • So verbessern Sie die Leistung von ASP.NET Core-Anwendungen
  • So verwenden Sie eine ASP.NET Core-Web-API mit RestSharp
  • So arbeiten Sie mit der Protokollierung in ASP.NET Core
  • Verwendung von MediatR in ASP.NET Core
  • So arbeiten Sie mit dem Sitzungsstatus in ASP.NET Core
  • Verwendung von Nancy in ASP.NET Core
  • Grundlegendes zur Parameterbindung in der ASP.NET-Web-API
  • So laden Sie Dateien in ASP.NET Core MVC hoch
  • Implementieren der globalen Ausnahmebehandlung in der ASP.NET Core-Web-API
  • Implementieren von Integritätsprüfungen in ASP.NET Core
  • Best Practices für das Caching in ASP.NET
  • Verwendung von Apache Kafka Messaging in .NET
  • So aktivieren Sie CORS in Ihrer Web-API
  • Wann wird WebClient vs. HttpClient vs. HttpWebRequest verwendet?
  • So arbeiten Sie mit Redis Cache in .NET
  • Verwendung von Task.WaitAll vs. Task.WhenAll in .NET