web-dev-qa-db-fra.com

Meilleure approche de l'API Web pour renvoyer HttpResponseMessage

J'ai un projet d'API Web et mes méthodes me renvoient toujours HttpResponseMessage.

Donc, si cela fonctionne ou échoue, je retourne:

Aucune erreur:

return Request.CreateResponse(HttpStatusCode.OK,"File was processed.");

Toute erreur ou échec

return Request.CreateResponse(HttpStatusCode.NoContent, "The file has no content or rows to process.");

Quand je retourne un objet alors j'utilise:

return Request.CreateResponse(HttpStatusCode.OK, user);

Je voudrais savoir comment puis-je retourner à mon client HTML5 une meilleure réponse encapsulée afin de pouvoir renvoyer plus d'informations sur la transaction, etc.

Je pensais à la création d'une classe personnalisée qui puisse encapsuler HttpResponseMessage mais qui contient également plus de données.

Est-ce que quelqu'un a mis en place quelque chose de similaire?

29
VAAA

Bien que cela ne réponde pas directement à la question, je souhaitais fournir quelques informations que je trouvais utiles. http://weblogs.asp.net/dwahlin/archive/2013/11/11/new-features-in-asp-net-web-api-2-part-i.aspx

HttpResponseMessage a été plus ou moins remplacé par IHttpActionResult. C'est beaucoup plus propre et plus facile à utiliser.

public IHttpActionResult Get()
{
     Object obj = new Object();
     if (obj == null)
         return NotFound();
     return Ok(obj);
 }

Ensuite, vous pouvez encapsuler pour en créer des personnalisés. Comment définir des en-têtes personnalisés lors de l'utilisation de IHttpActionResult?

Je n'ai pas encore trouvé le besoin d'implémenter un résultat personnalisé, mais quand je le ferai, j'irai dans cette voie.

C'est probablement très similaire à utiliser l'ancien.

Pour aller plus loin et fournir un peu plus d’informations. Vous pouvez également inclure des messages avec certaines des demandes. Par exemple.

return BadRequest("Custom Message Here");

Vous ne pouvez pas faire cela avec beaucoup d’autres mais vous aidez pour les messages courants que vous voulez renvoyer.

36
Kalel Wade

Vous pouvez renvoyer une réponse d'erreur pour fournir plus de détails.

public HttpResponseMessage Get()
{
    HttpError myCustomError = new HttpError("The file has no content or rows to process.") { { "CustomErrorCode", 42 } };
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, myCustomError);
 }

Retournerais:

{ 
  "Message": "The file has no content or rows to process.", 
  "CustomErrorCode": 42 
}

Plus de détails ici: http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

J'utilise aussi http://en.wikipedia.org/wiki/List_of_HTTP_status_codes pour m'aider à déterminer le code d'état HTTP à renvoyer.

5
Trisk

Une note importante: ne mettez pas de contenu dans 204 réponses! Non seulement cela va à l’encontre de la spécification HTTP, mais .NET peut se comporter de manière inattendue si vous le faites.

J'ai utilisé par erreur return Request.CreateResponse(HttpStatusCode.NoContent, null); et cela a entraîné un vrai mal de tête; les futures demandes de la même session se briseraient à cause d'un "null" valeur de chaîne ajoutée à la réponse. J'imagine que .NET n'effectue pas toujours une suppression complète de l'objet de réponse pour les appels d'API de la même session.

2
BigTone