Je recherche la bonne façon de renvoyer JSON avec un code d'état HTTP dans mon contrôleur API Web .NET Core. J'utilise pour l'utiliser comme ceci:
public IHttpActionResult GetResourceData()
{
return this.Content(HttpStatusCode.OK, new { response = "Hello"});
}
C'était dans une application MVC 4.6 mais maintenant avec .NET Core, je ne semble pas avoir ce que IHttpActionResult
j'ai ActionResult
et utiliser comme ceci:
public ActionResult IsAuthenticated()
{
return Ok(Json("123"));
}
Mais la réponse du serveur est étrange, comme dans l'image ci-dessous:
Je veux juste que le contrôleur de l'API Web renvoie JSON avec un code d'état HTTP comme je l'ai fait dans l'API Web 2.
CreatedAtRoute
méthode etc.Réponses:
La version la plus basique qui répond par un
JsonResult
est:Cependant, cela n'aidera pas votre problème car vous ne pouvez pas traiter explicitement votre propre code de réponse.
par exemple:
Notez que les deux exemples ci-dessus proviennent d'un excellent guide disponible dans la documentation Microsoft: Formatage des données de réponse
Trucs supplémentaires
Le problème que je rencontre assez souvent est que je voulais un contrôle plus granulaire sur mon WebAPI plutôt que de simplement utiliser la configuration par défaut du modèle "Nouveau projet" dans VS.
Assurons-nous que vous avez quelques notions de base ...
Étape 1: Configurez votre service
Pour que votre ASP.NET Core WebAPI réponde avec un objet sérialisé JSON avec un contrôle total du code d'état, vous devez commencer par vous assurer que vous avez inclus le
AddMvc()
service dans votreConfigureServices
méthode qui se trouve généralement dansStartup.cs
.Si votre projet nécessite un contrôle total et que vous souhaitez définir strictement vos services, comme par exemple comment votre WebAPI se comportera face à différents types de requêtes, y compris
application/json
et ne répondra pas à d'autres types de requêtes (comme une requête de navigateur standard), vous pouvez le définir manuellement avec le code suivant:Vous remarquerez que j'ai également inclus un moyen pour vous d'ajouter vos propres formateurs d'entrée / sortie personnalisés, dans le cas où vous voudriez peut-être répondre à un autre format de sérialisation (protobuf, thrift, etc.).
Le morceau de code ci-dessus est principalement un double de la
AddMvc()
méthode. Cependant, nous implémentons chaque service "par défaut" par nous-mêmes en définissant chaque service au lieu de choisir celui pré-livré avec le modèle. J'ai ajouté le lien du référentiel dans le bloc de code, ou vous pouvez extraireAddMvc()
le référentiel GitHub. .Notez qu'il existe des guides qui essaieront de résoudre ce problème en "annulant" les valeurs par défaut, plutôt que de simplement ne pas l'implémenter en premier lieu ... Si vous tenez compte du fait que nous travaillons maintenant avec Open Source, c'est un travail redondant , mauvais code et franchement une vieille habitude qui va bientôt disparaître.
Étape 2: créer un contrôleur
Je vais vous en montrer une très simple juste pour que votre question soit triée.
Étape 3: Vérifiez votre
Content-Type
etAccept
Vous devez vous assurer que vos en
Content-Type
-Accept
têtes et dans votre demande sont correctement définis. Dans votre cas (JSON), vous voudrez le configurer pour êtreapplication/json
.Si vous souhaitez que votre WebAPI réponde en tant que JSON par défaut, indépendamment de ce que l'en-tête de la demande spécifie, vous pouvez le faire de plusieurs manières .
Méthode 1 Comme indiqué dans l'article que j'ai recommandé plus tôt ( Formatage des données de réponse ), vous pouvez forcer un format particulier au niveau Contrôleur / Action. Personnellement, je n'aime pas cette approche ... mais ici, c'est par souci d'exhaustivité:
Voie 2 Ma méthode préférée est que WebAPI réponde à toutes les demandes avec le format demandé. Cependant, dans le cas où il n'accepte pas le format demandé, revenez à une valeur par défaut (c'est-à-dire JSON)
Tout d'abord, vous devrez l'enregistrer dans vos options (nous devons retravailler le comportement par défaut, comme indiqué précédemment)
Enfin, en réorganisant simplement la liste des formateurs qui ont été définis dans le générateur de services, l'hébergeur Web adoptera par défaut le formateur que vous positionnez en haut de la liste (c'est-à-dire la position 0).
Plus d'informations peuvent être trouvées dans cette entrée du blog sur le développement Web et les outils .NET
la source
IActionResult
avec lesreturn Ok(new {response = "123"});
Cheers!RespectBrowserAcceptHeader
est essentiel lors de la mise en œuvre de l'utilisation d'un sérialiseur alternatif ou plus généralement, lorsque vous voulez vous assurer que vos clients n'envoient pas de demandes mal formées. Par conséquent, j'ai mis l'accent sur "Si votre projet nécessite un contrôle total et que vous souhaitez définir strictement votre service" et notez également la citation en bloc en surbrillance au-dessus de cette déclaration.Vous disposez de méthodes prédéfinies pour les codes d'état les plus courants.
Ok(result)
retourne200
avec réponseCreatedAtRoute
renvoie201
+ nouvelle URL de ressourceNotFound
Retour404
BadRequest
retours400
etc.Voir
BaseController.cs
etController.cs
pour une liste de toutes les méthodes.Mais si vous insistez vraiment, vous pouvez utiliser
StatusCode
pour définir un code personnalisé, mais vous ne devriez vraiment pas car cela rend le code moins lisible et vous devrez répéter le code pour définir les en-têtes (comme pourCreatedAtRoute
).la source
JSON
leActionResult
créé par laJson()
méthode. Il n'inclut pas directement la chaîne "123".Json(...)
et de passer la chaîne àStatusCode
Avec ASP.NET Core 2.0 , le moyen idéal de renvoyer un objet à partir de
Web API
(qui est unifié avec MVC et utilise la même classe de baseController
) estRemarquerez que
200 OK
code de statut (c'est unOk
type deObjectResult
)Accept
tête de la demande. SiAccept: application/xml
est envoyé dans la demande, il retournera commeXML
. Si rien n'est envoyé,JSON
c'est la valeur par défaut.S'il doit être envoyé avec un code d'état spécifique , utilisez
ObjectResult
ou à laStatusCode
place. Les deux font la même chose et prennent en charge la négociation de contenu.ou encore plus fin avec ObjectResult:
Si vous souhaitez spécifiquement revenir en tant que JSON , il existe deux façons
Remarquerez que
JSON
de deux manières différentes.Json(object)
.Produces()
attribut (qui est aResultFilter
) aveccontentType = application/json
En savoir plus sur eux dans la documentation officielle . En savoir plus sur les filtres ici .
La classe de modèle simple utilisée dans les exemples
la source
Le moyen le plus simple que j'ai trouvé est:
la source
C'est ma solution la plus simple:
ou
la source
Au lieu d'utiliser les codes d'état 404/201 en utilisant enum
la source
Des réponses géniales que j'ai trouvées ici et j'ai également essayé cette déclaration de retour voir
StatusCode(whatever code you wish)
et cela a fonctionné !!!la source
Veuillez vous référer au code ci-dessous, vous pouvez gérer plusieurs codes d'état avec différents types JSON
la source
Ce que je fais dans mes applications Asp Net Core Api, c'est de créer une classe qui s'étend d'ObjectResult et de fournir de nombreux constructeurs pour personnaliser le contenu et le code d'état. Ensuite, toutes mes actions de contrôleur utilisent l'un des costructeurs comme approprié. Vous pouvez jeter un oeil à mon implémentation à: https://github.com/melardev/AspNetCoreApiPaginatedCrud
et
https://github.com/melardev/ApiAspCoreEcommerce
voici à quoi ressemble la classe (allez dans mon dépôt pour le code complet):
Notez la base (dto) que vous remplacez dto par votre objet et vous devriez être prêt à partir.
la source
J'ai fait fonctionner ça. Mon gros problème était que mon json était une chaîne (dans ma base de données ... et non un type spécifique / connu).
Ok, j'ai enfin réussi à faire fonctionner ça.
Il se trouve que je suis sur asp.net core 3.1
J'ai eu l'indice d'ici :: https://www.jianshu.com/p/7b3e92c42b61
la source