Ich habe einen REST-Service der ASP.NET-Web-API (Version 4), bei dem ich ein Array von Ganzzahlen übergeben muss.
Hier ist meine Aktionsmethode:
public IEnumerable<Category> GetCategories(int[] categoryIds){
// code to retrieve categories from database
}
Und das ist die URL, die ich versucht habe:
/Categories?categoryids=1,2,3,4
c#
arrays
rest
asp.net-web-api
Hemanshu Bhojak
quelle
quelle
Antworten:
Sie müssen nur
[FromUri]
vor dem Parameter hinzufügen , sieht aus wie:Und Anfrage senden:
quelle
Wie Filip W hervorhebt, müssen Sie möglicherweise auf einen benutzerdefinierten Modellordner wie diesen zurückgreifen (geändert, um an den tatsächlichen Parametertyp zu binden):
Und dann kann man sagen:
/Categories?categoryids=1,2,3,4
und die ASP.NET-Web-API bindet IhrcategoryIds
Array korrekt .quelle
ModelBinderAttribute
sodass es direkt anstelle der mühsamen Syntax verwendet werden kann, die dastypeof()
Argument verwendet. Alles, was Sie tun müssen, ist wie folgt zu erben:CommaDelimitedArrayModelBinder : ModelBinderAttribute, IModelBinder
und dann einen Standardkonstruktor bereitzustellen, der die Typdefinition auf die Basisklasse herunterschiebt :public CommaDelimitedArrayModelBinder() : base(typeof(CommaDelimitedArrayModelBinder)) { }
.System.Collections.Generic.List<long>
alsbindingContext.ModelType.GetElementType()
nur UnterstützungSystem.Array
TypenIch bin kürzlich selbst auf diese Anforderung gestoßen und habe beschlossen, eine
ActionFilter
zu implementieren , um dies zu handhaben.Ich wende es so an (beachte, dass ich 'id' verwendet habe, nicht 'ids', da es so in meiner Route angegeben ist):
Und die öffentliche URL wäre:
Möglicherweise müssen Sie dies umgestalten, um Ihre spezifischen Anforderungen zu erfüllen.
quelle
Für den Fall, dass jemand das Gleiche oder Ähnliches (wie Löschen) über
POST
anstelle vonFromUri
, verwenden SieFromBody
und auf clientseitiger (JS / jQuery) Formatparameter als erreichen müsste$.param({ '': categoryids }, true)
c #:
jQuery:
Die Sache mit
$.param({ '': categoryids }, true)
ist, dass es .net erwartet, dass der Post-Body einen urlencodierten Wert enthält, wie=1&=2&=3
ohne Parameternamen und ohne Klammern.quelle
code to retrieve categories from database
, daher sollte die Methode eine GET-Methode sein, nicht POST.Einfache Möglichkeit, Array-Parameter an die Web-API zu senden
API
Jquery: JSON-Objekt als Anforderungsparameter senden
Es wird Ihre Anforderungs-URL wie generiert
../api/categories/GetCategories?categoryIds=1&categoryIds=2&categoryIds=3&categoryIds=4
quelle
Sie können diesen Code versuchen, um durch Kommas getrennte Werte / ein Array von Werten zu verwenden, um einen JSON von webAPI zurückzugewinnen
Ausgabe :
quelle
ASP.NET Core 2.0-Lösung (Swagger Ready)
Eingang
Code
Schreiben Sie den Anbieter (woher MVC weiß, welcher Ordner verwendet werden soll)
Schreiben Sie den eigentlichen Ordner (greifen Sie auf alle möglichen Informationen zu Anfrage, Aktion, Modellen, Typen usw. zu).
Registrieren Sie es bei MVC
Beispielnutzung mit einem gut dokumentierten Controller für Swagger
BEARBEITEN: Microsoft empfiehlt, für diese untergeordneten Elemente einen TypeConverter für diesen Ansatz zu verwenden. Befolgen Sie daher die folgenden Hinweise für Poster und dokumentieren Sie Ihren benutzerdefinierten Typ mit einem SchemaFilter.
quelle
Ich habe ursprünglich jahrelang die Lösung @Mrchief verwendet (sie funktioniert hervorragend). Aber als ich Swagger zu meinem Projekt für API-Dokumentation hinzufügte , war mein Endpunkt NICHT angezeigt.
Es hat eine Weile gedauert, aber das habe ich mir ausgedacht. Es funktioniert mit Swagger und Ihre API-Methodensignaturen sehen sauberer aus:
Am Ende können Sie tun:
WebApiConfig.cs
Erstellen Sie eine neue Klasse: CommaDelimitedArrayParameterBinder.cs
Erstellen Sie eine neue Klasse: StringToIntArrayConverter.cs
Anmerkungen:
quelle
Verwendungszweck:
Uri anfordern
quelle
/
als Trenner funktionieren? Dann könnten Sie haben: DNS / Root / Mystuff / Pfad / zu / einige / Ressource zugeordnetpublic string GetMyStuff(params string[] pathBits)
Anstatt einen benutzerdefinierten ModelBinder zu verwenden, können Sie auch einen benutzerdefinierten Typ mit einem TypeConverter verwenden.
Der Vorteil besteht darin, dass die Parameter der Web-API-Methode sehr einfach sind. Sie müssen nicht einmal [FromUri] angeben.
Dieses Beispiel bezieht sich auf eine Liste von Zeichenfolgen, die Sie jedoch ausführen können
categoryIds.Select(int.Parse)
bezieht auch eine IntList erstellen oder einfach schreiben.quelle
Wenn Sie eine Liste / ein Array von Ganzzahlen auflisten möchten, akzeptieren Sie am einfachsten die durch Kommas (,) getrennte Liste der Zeichenfolgen und konvertieren Sie sie in eine Liste von Ganzzahlen. Vergessen Sie nicht, [FromUri] attriubte zu erwähnen. Ihre URL sieht folgendermaßen aus:
quelle
List<string>
statt nurstring
? Es wird nur eine Zeichenfolge enthalten sein, die sich1,2,3,289,56
in Ihrem Beispiel befindet. Ich werde eine Bearbeitung vorschlagen.List<Guid>
automatisch an einen binden würde . Beachten Sie, dass in Asp.net Core die Anmerkung vorhanden ist[FromQuery]
und nicht benötigt wird.Machen Sie den Methodentyp [HttpPost], erstellen Sie ein Modell mit einem int [] -Parameter und posten Sie mit json:
quelle
public IEnumerable<Category> GetCategories(int[] categoryIds){
- Ja, Sie könnten auf verschiedene Arten interpretieren, nehme ich an. Aber oft möchte ich keine Wrapper-Klassen erstellen, um Wrapper zu erstellen. Wenn Sie komplexe Objekte haben, funktioniert das einfach. Die Unterstützung dieser einfacheren Fälle funktioniert nicht sofort, daher das OP.POST
ist eigentlich gegen das REST-Paradigma. Somit wäre eine solche API keine REST-API.Oder Sie übergeben einfach eine Zeichenfolge mit begrenzten Elementen und fügen sie auf der Empfangsseite in ein Array oder eine Liste ein.
quelle
Ich habe dieses Problem auf diese Weise angesprochen.
Ich habe eine Post-Nachricht an die API verwendet, um die Liste der Ganzzahlen als Daten zu senden.
Dann habe ich die Daten als ienumerable zurückgegeben.
Der Sendecode lautet wie folgt:
Der Empfangscode lautet wie folgt:
Es funktioniert gut für einen Datensatz oder mehrere Datensätze. Die Füllung ist eine überladene Methode mit DapperExtensions:
Auf diese Weise können Sie Daten aus einer zusammengesetzten Tabelle (der ID-Liste) abrufen und dann die Datensätze, an denen Sie wirklich interessiert sind, aus der Zieltabelle zurückgeben.
Sie könnten dasselbe mit einer Ansicht tun, aber dies gibt Ihnen ein wenig mehr Kontrolle und Flexibilität.
Außerdem werden die Details dessen, was Sie in der Datenbank suchen, nicht in der Abfragezeichenfolge angezeigt. Sie müssen auch nicht aus einer CSV-Datei konvertieren.
Wenn Sie ein Tool wie die Web-API 2.x-Oberfläche verwenden, müssen Sie berücksichtigen, dass die Funktionen zum Abrufen, Einfügen, Veröffentlichen, Löschen, Kopf usw. eine allgemeine Verwendung haben, jedoch nicht auf diese Verwendung beschränkt sind.
Während Post im Allgemeinen in einem Erstellungskontext in der Web-API-Oberfläche verwendet wird, ist es nicht auf diese Verwendung beschränkt. Es ist ein regulärer HTML-Aufruf, der für jeden von der HTML-Praxis zugelassenen Zweck verwendet werden kann.
Darüber hinaus sind die Details dessen, was vor sich geht, vor diesen "neugierigen Augen" verborgen, von denen wir heutzutage so viel hören.
Die Flexibilität bei der Benennung von Konventionen in der Web-API 2.x-Oberfläche und die Verwendung von regulären Web-Anrufen bedeutet, dass Sie einen Anruf an die Web-API senden, der Snoopers in die Irre führt, zu glauben, dass Sie wirklich etwas anderes tun. Mit "POST" können Sie beispielsweise wirklich Daten abrufen.
quelle
Ich habe einen benutzerdefinierten Modellordner erstellt, der alle durch Kommas getrennten Werte (nur Grundelemente, Dezimalzahlen, Gleitkommazahlen, Zeichenfolgen) in die entsprechenden Arrays konvertiert.
Und wie man in Controller verwendet:
quelle
Meine Lösung bestand darin, ein Attribut zum Validieren von Zeichenfolgen zu erstellen. Es enthält eine Reihe zusätzlicher allgemeiner Funktionen, einschließlich der Regex-Validierung, mit der Sie nur nach Zahlen suchen können. Später konvertiere ich nach Bedarf in Ganzzahlen.
So verwenden Sie:
quelle