Szukam prawidłowego sposobu zwracania kodu JSON z kodem stanu HTTP w moim kontrolerze interfejsu API sieci Web .NET Core. Używam tego w ten sposób:
public IHttpActionResult GetResourceData()
{
return this.Content(HttpStatusCode.OK, new { response = "Hello"});
}
To było w aplikacji 4.6 MVC, ale teraz z .NET Core wydaje mi się, że nie mam tego, IHttpActionResult
co mam ActionResult
i używam w ten sposób:
public ActionResult IsAuthenticated()
{
return Ok(Json("123"));
}
Ale odpowiedź z serwera jest dziwna, jak na poniższym obrazku:
Chcę tylko, aby kontroler interfejsu API sieci Web zwracał kod JSON z kodem stanu HTTP, tak jak w przypadku interfejsu API sieci Web 2.
c#
json
asp.net-core
asp.net-core-webapi
Rossco
źródło
źródło
CreatedAtRoute
metody itp.Odpowiedzi:
Najbardziej podstawowa wersja odpowiadająca za pomocą
JsonResult
to:Jednak to nie pomoże w rozwiązaniu problemu, ponieważ nie możesz jawnie zająć się własnym kodem odpowiedzi.
na przykład:
Zauważ, że oba powyższe przykłady pochodzą ze świetnego przewodnika dostępnego w Microsoft Documentation: Formatting Response Data
Dodatkowe rzeczy
Problem, z którym często się spotykam, polega na tym, że chciałem mieć bardziej szczegółową kontrolę nad moim interfejsem WebAPI, a nie tylko korzystać z domyślnej konfiguracji z szablonu „Nowy projekt” w VS.
Upewnijmy się, że znasz podstawy ...
Krok 1: Skonfiguruj usługę
Aby Twoje ASP.NET Core WebAPI odpowiadało za pomocą obiektu serializowanego JSON wraz z pełną kontrolą nad kodem stanu, należy zacząć od upewnienia się, że
AddMvc()
usługa została uwzględniona wConfigureServices
metodzie zwykle znajdującej się wStartup.cs
.Jeśli Twój projekt wymaga pełnej kontroli i chcesz ściśle zdefiniować swoje usługi, na przykład sposób, w jaki Twoje WebAPI będzie zachowywać się w przypadku różnych typów żądań, w tym
application/json
i nie odpowiadać na inne typy żądań (takie jak standardowe żądania przeglądarki), możesz zdefiniować je ręcznie za pomocą następujący kod:Zauważysz, że zamieściłem również sposób dodawania własnych niestandardowych elementów formatujących wejścia / wyjścia, na wypadek, gdybyś chciał odpowiedzieć na inny format serializacji (protobuf, oszczędność itp.).
Fragment powyższego kodu jest w większości duplikatem
AddMvc()
metody. Jednak każdą usługę „domyślną” wdrażamy samodzielnie, definiując każdą usługę, zamiast korzystać z usługi wstępnie dostarczonej z szablonem. Dodałem link do repozytorium w bloku kodu lub możesz wyewidencjonowaćAddMvc()
z repozytorium GitHub. .Zwróć uwagę, że istnieje kilka poradników, które spróbują rozwiązać ten problem przez „cofanie” wartości domyślnych, zamiast po prostu ich nie implementować w pierwszej kolejności… Jeśli weźmiesz pod uwagę fakt, że pracujemy teraz z Open Source, jest to praca zbędna , zły kod i szczerze mówiąc stary nawyk, który wkrótce zniknie.
Krok 2: Utwórz kontroler
Pokażę ci naprawdę proste, żeby uporządkować twoje pytanie.
Krok 3: Sprawdź
Content-Type
iAccept
Musisz upewnić się, że Twoje
Content-Type
iAccept
nagłówki w żądaniu są ustawione poprawnie. W twoim przypadku (JSON), będziesz chciał ustawić to naapplication/json
.Jeśli chcesz, aby Twoje WebAPI odpowiadało domyślnie jako JSON, niezależnie od tego, co określa nagłówek żądania, możesz to zrobić na kilka sposobów .
Sposób 1 Jak pokazano w artykule, który zaleciłem wcześniej ( Formatowanie danych odpowiedzi ), możesz wymusić określony format na poziomie kontrolera / akcji. Osobiście nie podoba mi się to podejście ... ale tutaj chodzi o kompletność:
Sposób 2 Moją preferowaną metodą jest odpowiadanie przez WebAPI na wszystkie żądania w żądanym formacie. Jednak w przypadku, gdy nie akceptuje żądanego formatu, wróć do domyślnego (tj. JSON)
Najpierw musisz to zarejestrować w opcjach (musimy przerobić domyślne zachowanie, jak wspomniano wcześniej)
Wreszcie, po prostu zmieniając kolejność na liście elementów formatujących, które zostały zdefiniowane w narzędziu do tworzenia usług, host sieciowy domyślnie ustawi program formatujący, który umieścisz na górze listy (tj. Pozycja 0).
Więcej informacji można znaleźć w tym wpisie blogu .NET Web Development and Tools
źródło
IActionResult
zreturn Ok(new {response = "123"});
Pozdrowieniami!RespectBrowserAcceptHeader
ma to kluczowe znaczenie przy implementacji korzystania z alternatywnego serializatora lub częściej, gdy chcesz mieć pewność, że Twoi klienci nie wysyłają źle sformułowanych żądań. Dlatego też podkreśliłem „Jeśli Twój projekt wymaga pełnej kontroli i chcesz ściśle określić swoją usługę” i zwróć uwagę na podświetlony cytat blokowy nad tym stwierdzeniem.Masz predefiniowane metody dla większości typowych kodów stanu.
Ok(result)
wraca200
z odpowiedziąCreatedAtRoute
zwraca201
+ nowy adres URL zasobuNotFound
zwroty404
BadRequest
zwroty400
itp.Zobacz
BaseController.cs
iController.cs
listę wszystkich metod.Ale jeśli naprawdę nalegasz, możesz użyć
StatusCode
do ustawienia niestandardowego kodu, ale naprawdę nie powinieneś, ponieważ sprawia to, że kod jest mniej czytelny i będziesz musiał powtórzyć kod, aby ustawić nagłówki (jak dlaCreatedAtRoute
).źródło
JSON
doActionResult
utworzonego za pomocąJson()
metody. Nie zawiera bezpośrednio ciągu „123”.Json(...)
i przekaż ciąg doStatusCode
W przypadku ASP.NET Core 2.0 idealnym sposobem na zwrócenie obiektu z
Web API
(ujednoliconego z MVC i używającego tej samej klasy bazowejController
) jestZauważ, że
200 OK
kodem statusu (jest toOk
typObjectResult
)Accept
nagłówka w żądaniu. JeśliAccept: application/xml
zostanie wysłane w żądaniu, wróci jakoXML
. Jeśli nic nie jest wysyłane,JSON
jest to ustawienie domyślne.Jeśli trzeba wysłać z określonym kodem statusu , użyj
ObjectResult
lubStatusCode
. Obie robią to samo i obsługują negocjacje treści.lub jeszcze bardziej drobnoziarnisty dzięki ObjectResult:
Jeśli chcesz powrócić jako JSON , istnieje kilka sposobów
Zauważ, że
JSON
na dwa różne sposoby.Json(object)
.Produces()
atrybutu (który jestResultFilter
) withcontentType = application/json
Przeczytaj więcej o nich w oficjalnej dokumentacji . Dowiedz się o filtrach tutaj .
Prosta klasa modelu używana w przykładach
źródło
Najłatwiejszy sposób jaki wymyśliłem to:
źródło
To jest moje najłatwiejsze rozwiązanie:
lub
źródło
Zamiast używać kodów stanu 404/201 przy użyciu enum
źródło
Niesamowite odpowiedzi, które znalazłem tutaj, a także wypróbowałem to oświadczenie zwrotne, zobacz
StatusCode(whatever code you wish)
i zadziałało !!!źródło
Zapoznaj się z poniższym kodem, możesz zarządzać wieloma kodami stanu za pomocą innego typu JSON
źródło
To, co robię w moich aplikacjach Asp Net Core Api, polega na utworzeniu klasy, która rozszerza się z ObjectResult i udostępnieniu wielu konstruktorów w celu dostosowania zawartości i kodu stanu. Wtedy wszystkie moje działania kontrolera używają jednego z projektorów jako odpowiedniego. Możesz rzucić okiem na moją realizację pod adresem : https://github.com/melardev/AspNetCoreApiPaginatedCrud
i
https://github.com/melardev/ApiAspCoreEcommerce
oto jak wygląda klasa (przejdź do mojego repozytorium po pełny kod):
Zwróć uwagę na bazę (dto), którą zastępujesz dto przez swój obiekt i powinno być dobrze.
źródło
Mam to do dzieła. Moim wielkim problemem było to, że mój plik json był ciągiem (w mojej bazie danych ... a nie określonym / znanym typem).
Ok, w końcu to zadziałało.
Tak się składa, że jestem na asp.net core 3.1
Mam tutaj wskazówkę: https://www.jianshu.com/p/7b3e92c42b61
źródło