Ü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