ASP.net Core RC2 Web API POST - Lors de l'utilisation de Créer, CreatedAtAction, vs CreatedAtRoute?
Quelles sont les différences fondamentales de ces fonctions? Tout ce que je sais est tous les trois entraîner une 201, qui est approprié pour la réussite d'une requête POST.
Je ne suis que des exemples, je vois en ligne, mais ils n'ont pas vraiment expliquer pourquoi ils font ce qu'ils font.
Nous sommes censés fournir un nom pour notre (1 dossier par id):
[HttpGet("{id}", Name="MyStuff")]
public async Task<IActionResult> GetAsync(int id)
{
return new ObjectResult(new MyStuff(id));
}
Quel est le but de nommer cette fonction obtenir, outre le fait que c'est "probablement" requis pour le POSTE à la fonction ci-dessous:
[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]MyStuff myStuff)
{
//actual insertion code left out
return CreatedAtRoute("MyStuff", new { id = myStuff.Id }, myStuff);
}
Je remarque que CreatedAtRoute
dispose également d'une surcharge, qui ne sont pas dans le nom de la route.
Il est également CreatedAtAction
qui prend en paramètres similaires. Pourquoi cette variante existe pas?
Il est également Created
qui s'attend à une URL et l'objet que nous voulons revenir. Puis-je utiliser cette variante et de fournir un faux URL et retourne l'objet que je veux et de le faire et de plus avec?
Je ne suis pas sûr de savoir pourquoi il y a tellement de variantes juste pour être en mesure de retourner un 201 pour le client. Dans la plupart des cas, tout ce que je veux faire est de retourner à l ' "app-attribué" (le plus probable à partir d'une base de données) id unique ou une version de mon entité qui a un minimum d'informations.
Je pense qu'en fin de compte, 201 réponse "doit" créer un en-tête location qui a l'URL de la nouvelle ressource, qui, je crois, tous les 3 et de leurs surcharges de faire. Pourquoi devrais-je reviens toujours un en-tête location? Mon JavaScript clients, mobile native, et les applications de bureau ne jamais l'utiliser. Si j'émets un HTTP POST, par exemple, pour créer des relevés de facturation et de les envoyer aux utilisateurs, quel serait l'emplacement de l'URL est? (Toutes mes excuses pour ne pas creuser plus profondément dans l'histoire de l'Internet pour trouver une réponse à cela.)
Pourquoi créer des noms pour les actions et les routes? Quelle est la différence entre les noms d'action et de noms de routes?
Je suis confus à ce sujet, j'ai donc eu recours à la restitution de la Ok()
, qui renvoie à 200, ce qui est inapproprié pour le POST.
Vous devez vous connecter pour publier un commentaire.
Il y a quelques questions qui devraient probablement être séparé, mais je pense que cela couvre la majeure partie de vos questions.
Pourquoi créer des noms pour les actions et les routes? Quelle est la différence entre les noms d'action et de noms de routes?
Tout d'abord, les actions et les routes sont très différentes.
Une Action de la vie d'un contrôleur. Un itinéraire spécifie complet d'un point de fin, qui se compose d'un Contrôleur et l'Action, et potentiellement d'autres paramètres de la route.
Vous pouvez donner un nom à une route qui permet d'y faire référence dans votre application. par exemple
La raison pour laquelle les noms d'action sont couverts par cette question: Le but de ActionName
Quelles sont les différences fondamentales de ces fonctions?
Ces 3 fonctions fonctionnent essentiellement de la même fonction - retour d'un
201 Created
réponse, avec unLocation
en-tête pointant vers l'url pour le nouvellement créé de réponse, et l'objet lui-même dans le corps. L'url est l'url à laquelle une demande de retour de l'objet de l'url. Cela serait considéré comme de la "Corriger" le comportement d'un système Reposant.Pour l'exemple de code postal dans votre question, vous voulez vraiment utiliser
CreatedAtAction
.En supposant que vous avez l'itinéraire par défaut configuré, cela va ajouter un en-tête location pointant vers le
MyStuff
action sur le même contrôleur.Si vous vouliez l'emplacement de l'url pour pointer vers un itinéraire précis (comme nous l'avons défini précédemment, vous pouvez utiliser, par exemple,
Puis-je utiliser cette variante et de fournir un faux URL et retourne l'objet que je veux et de le faire et de plus avec?
Si vraiment vous ne voulez pas utiliser un
CreatedResult
, vous pouvez utiliser un simpleStatusCodeResult
, qui sera de retour une 201, sans leLocation
- Tête ou le corps.Content<T>(HttpStatusCode, T content)
méthode existent encore pour retourner à la fois un code d'état, et le contenu? Que devrait permettre le retour 201 avec l'objet nouvellement créé, sans que laLocation
en-tête.StatusCode(int httpStatusCode, object value)
[HttpGet("{id}", Name = "GetUser",Order = 0)]
façon de créer un itinéraire ne semble pas fonctionner avec CreatedAtRoute()