La version la plus basique qui répond par un JsonResult
est:
// GET: api/authors
[HttpGet]
public JsonResult Get()
{
return Json(_authorRepository.List());
}
Cependant, cela n'aidera pas votre problème car vous ne pouvez pas traiter explicitement votre propre code de réponse.
La façon d'obtenir le contrôle sur les résultats de statut, est que vous devez renvoyer un ActionResult
qui est l'endroit où vous pouvez ensuite profiter du StatusCodeResult
type.
par exemple:
// GET: api/authors/search?namelike=foo
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
var result = _authorRepository.GetByNameSubstring(namelike);
if (!result.Any())
{
return NotFound(namelike);
}
return Ok(result);
}
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 votre ConfigureServices
méthode qui se trouve généralement dans Startup.cs
.
Il est important de noter que cela AddMvc()
inclura automatiquement le formateur d'entrée / sortie pour JSON ainsi que la réponse à d'autres types de demandes.
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:
public void ConfigureServices(IServiceCollection services)
{
// Build a customized MVC implementation, without using the default AddMvc(), instead use AddMvcCore().
// https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs
services
.AddMvcCore(options =>
{
options.RequireHttpsPermanent = true; // does not affect api requests
options.RespectBrowserAcceptHeader = true; // false by default
//options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
//remove these two below, but added so you know where to place them...
options.OutputFormatters.Add(new YourCustomOutputFormatter());
options.InputFormatters.Add(new YourCustomInputFormatter());
})
//.AddApiExplorer()
//.AddAuthorization()
.AddFormatterMappings()
//.AddCacheTagHelper()
//.AddDataAnnotations()
//.AddCors()
.AddJsonFormatters(); // JSON, or you can build your own custom one (above)
}
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 extraire AddMvc()
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.
public class FooController
{
[HttpPost]
public async Task<IActionResult> Create([FromBody] Object item)
{
if (item == null) return BadRequest();
var newItem = new Object(); // create the object to return
if (newItem != null) return Ok(newItem);
else return NotFound();
}
}
É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 être application/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é:
Forcer un format particulier Si vous souhaitez restreindre les formats de réponse pour une action spécifique, vous pouvez appliquer le filtre [Produit]. Le filtre [Produit] spécifie les formats de réponse pour une action spécifique (ou un contrôleur). Comme la plupart des filtres, cela peut être appliqué au niveau de l'action, du contrôleur ou de la portée globale.
[Produces("application/json")]
public class AuthorsController
Le [Produces]
filtre forcera toutes les actions dans le
AuthorsController
à renvoyer des réponses au format JSON, même si d'autres formateurs ont été configurés pour l'application et que le client a fourni un en- Accept
tête demandant un format disponible différent.
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)
options.RespectBrowserAcceptHeader = true; // false by default
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
CreatedAtRoute
méthode etc.