Mam usługę REST interfejsu API sieci Web platformy ASP.NET (wersja 4), w której muszę przekazać tablicę liczb całkowitych.
Oto moja metoda działania:
public IEnumerable<Category> GetCategories(int[] categoryIds){
// code to retrieve categories from database
}
I to jest adres URL, który próbowałem:
/Categories?categoryids=1,2,3,4
c#
arrays
rest
asp.net-web-api
Hemanshu Bhojak
źródło
źródło
Odpowiedzi:
Musisz tylko dodać
[FromUri]
przed parametrem, wygląda to tak:I wyślij zapytanie:
źródło
Tak jak wskazuje Filip W , może być konieczne skorzystanie z niestandardowego modelu segregatora, takiego jak ten (zmodyfikowanego w celu powiązania z rzeczywistym typem parametru):
A potem możesz powiedzieć:
/Categories?categoryids=1,2,3,4
i ASP.NET Web API poprawnie powiązacategoryIds
tablicę.źródło
ModelBinderAttribute
więc można go użyć bezpośrednio zamiast żmudnej składni za pomocątypeof()
argumentu. Wszystko co musisz zrobić, to dziedziczą tak:CommaDelimitedArrayModelBinder : ModelBinderAttribute, IModelBinder
a następnie dostarczyć domyślny konstruktor, który popycha do definicji typu klasy bazowej:public CommaDelimitedArrayModelBinder() : base(typeof(CommaDelimitedArrayModelBinder)) { }
.System.Collections.Generic.List<long>
jakbindingContext.ModelType.GetElementType()
tylkoSystem.Array
typy wsparciaNiedawno sam spotkałem się z tym wymogiem i zdecydowałem się na wdrożenie
ActionFilter
tego rozwiązania.Stosuję go w ten sposób (zwróć uwagę, że użyłem „id”, a nie „id”, ponieważ tak to jest określone na mojej trasie):
Publiczny adres URL to:
Być może trzeba to zmienić, aby spełnić określone potrzeby.
źródło
Na wypadek, gdyby ktoś potrzebował - aby osiągnąć to samo lub podobne (np. Usunąć)
POST
zamiastFromUri
, użyjFromBody
i po stronie klienta (JS / jQuery) param format jak$.param({ '': categoryids }, true)
do#:
jQuery:
Chodzi o
$.param({ '': categoryids }, true)
to, że .net będzie oczekiwać, że treść postu będzie zawierać wartość zakodowaną w sposób jak=1&=2&=3
bez nazwy parametru i bez nawiasów.źródło
code to retrieve categories from database
, więc metoda powinna być metodą GET, a nie POST.Łatwy sposób na przesłanie parametrów tablicy do interfejsu API
API
Jquery: wyślij obiekt JSON jako parametry żądania
Wygeneruje Twój URL żądania
../api/categories/GetCategories?categoryIds=1&categoryIds=2&categoryIds=3&categoryIds=4
źródło
Możesz wypróbować ten kod, aby pobrać wartości oddzielone przecinkami / tablicę wartości, aby odzyskać JSON z webAPI
Wynik :
źródło
Rozwiązanie ASP.NET Core 2.0 (gotowe do Swagger)
Wejście
Kod
Napisz dostawcę (skąd MVC wie, jakiego spoiwa użyć)
Napisz rzeczywisty segregator (dostęp do wszelkiego rodzaju informacji o żądaniu, akcji, modelach, typach, cokolwiek)
Zarejestruj go w MVC
Przykładowe użycie z dobrze udokumentowanym kontrolerem Swagger
EDYCJA: Microsoft zaleca stosowanie TypeConverter dla tych dzieci operacji zamiast tego podejścia. Postępuj zgodnie z poniższymi wskazówkami dotyczącymi plakatów i udokumentuj swój niestandardowy typ za pomocą SchemaFilter.
źródło
Zamiast używać niestandardowego ModelBinder, możesz również użyć niestandardowego typu z TypeConverter.
Zaletą jest to, że sprawia, że parametry metody interfejsu API sieci Web są bardzo proste. Nie musisz nawet określać opcji [FromUri].
Ten przykład dotyczy Listy ciągów, ale
categoryIds.Select(int.Parse)
zamiast tego możesz zrobić lub po prostu napisać IntList.źródło
Pierwotnie korzystałem z rozwiązania, które @Mrchief od lat (działa świetnie). Ale kiedy dodałem Swagger do mojego projektu dla dokumentacji API, moim punktem końcowym NIE było pojawił się.
Zajęło mi to trochę czasu, ale to właśnie wymyśliłem. Działa z Swagger, a sygnatury metod API wyglądają na czystsze:
Na koniec możesz zrobić:
WebApiConfig.cs
Utwórz nową klasę: CommaDelimitedArrayParameterBinder.cs
Utwórz nową klasę: StringToIntArrayConverter.cs
Uwagi:
źródło
Stosowanie:
Poproś o uri
źródło
/
jako separator? Wtedy można mieć: DNS / root / mystuff / ścieżka / do / some / zasobu odwzorowanym napublic string GetMyStuff(params string[] pathBits)
Jeśli chcesz wyświetlić listę / tablicę liczb całkowitych, najłatwiej to zrobić, akceptuj listę ciągów oddzielonych przecinkami (,) i przekonwertuj ją na listę liczb całkowitych. Nie zapomnij wspomnieć o [FromUri] attriubte. Twój adres URL wygląda następująco:
źródło
List<string>
zamiast po prostustring
? będzie miał tylko jeden ciąg znaków, który jest1,2,3,289,56
w twoim przykładzie. Zasugeruję edycję.List<Guid>
automatycznie. Uwaga w Asp.net Core adnotacja jest[FromQuery]
i nie jest potrzebna.Ustaw metodę na typ [HttpPost], utwórz model, który ma jeden parametr int [], i opublikuj za pomocą json:
źródło
public IEnumerable<Category> GetCategories(int[] categoryIds){
- tak, mógłbym interpretować na różne sposoby, jak sądzę. Ale wiele razy nie chcę tworzyć klas opakowań dla tworzenia opakowań. Jeśli masz złożone obiekty, to po prostu zadziała. Obsługa tych prostszych przypadków jest tym, co nie działa po wyjęciu z pudełka, stąd OP.POST
jest w rzeczywistości sprzeczne z paradygmatem REST. Zatem taki interfejs API nie byłby interfejsem API REST.Lub możesz po prostu przekazać ciąg rozdzielanych elementów i umieścić go w tablicy lub liście na końcu odbierającym.
źródło
W ten sposób rozwiązałem ten problem.
Użyłem wiadomości post do interfejsu API, aby wysłać listę liczb całkowitych jako dane.
Następnie zwróciłem dane jako niezliczone.
Kod wysyłający jest następujący:
Kod odbierający jest następujący:
Działa dobrze dla jednego lub wielu rekordów. Wypełnienie to metoda przeładowana za pomocą DapperExtensions:
Pozwala to pobrać dane z tabeli złożonej (lista identyfikatorów), a następnie zwrócić rekordy, które naprawdę Cię interesują z tabeli docelowej.
Możesz zrobić to samo z widokiem, ale daje to nieco większą kontrolę i elastyczność.
Ponadto szczegóły tego, czego szukasz w bazie danych, nie są wyświetlane w ciągu zapytania. Nie musisz również konwertować z pliku csv.
Podczas korzystania z dowolnego narzędzia, takiego jak interfejs WWW API 2.x, należy pamiętać, że funkcje get, put, post, delete, head itp. Mają ogólne zastosowanie, ale nie są ograniczone do tego zastosowania.
Tak więc, chociaż post jest zwykle używany w kontekście tworzenia w interfejsie interfejsu WWW, nie jest on ograniczony do tego zastosowania. Jest to zwykłe połączenie HTML, którego można używać w dowolnym celu dozwolonym przez praktykę HTML.
Ponadto szczegóły tego, co się dzieje, są ukryte przed tymi „wścibskimi oczami”, które słyszymy o tych dniach.
Elastyczność w konwencjach nazewnictwa w interfejsie API 2.x i korzystanie z regularnych połączeń internetowych oznacza, że wysyłasz wywołanie do interfejsu API, które wprowadza w błąd szpiegów, którzy myślą, że naprawdę robisz coś innego. Możesz na przykład użyć „POST”, aby naprawdę odzyskać dane.
źródło
Utworzyłem spoiwo modelu niestandardowego, które konwertuje dowolne wartości oddzielone przecinkami (tylko prymitywne, dziesiętne, zmiennoprzecinkowe, łańcuchowe) na odpowiadające im tablice.
I jak korzystać z kontrolera:
źródło
Moje rozwiązanie polegało na utworzeniu atrybutu do sprawdzania poprawności ciągów, ma on szereg dodatkowych typowych funkcji, w tym sprawdzanie poprawności wyrażeń regularnych, których można użyć do sprawdzania tylko liczb, a następnie w razie potrzeby przekonwertowałem na liczby całkowite ...
Oto jak używasz:
źródło