Quelqu'un peut-il m'expliquer CreatedAtRoute ()?

136

À partir du modèle pour l'API Web 2, une méthode de publication est toujours comme ceci:

[ResponseType(typeof(MyDTO))]
public IHttpActionResult PostmyObject(MyDTO myObject)
{
    ...
    return CreatedAtRoute("DefaultApi", new { id = myObject.Id }, myObject);
}

Je ne comprends pas cette CreatedAtRoute()méthode. Quelqu'un peut-il m'expliquer la CreatedAtRoute()méthode?

martial
la source
25
@JohnSaunders, bien sûr, j'ai trouvé ces résultats Google. Mon problème est que ces documents ne m'aident pas à comprendre cette méthode, après les avoir lus, je ne comprends toujours pas. C'est pourquoi je demande ici.
Martial
11
Je ne vous demande donc pas de répondre à ma question.
martial
12
Si je peux Google et trouver une réponse, pourquoi est-ce que je prends la peine de passer du temps à modifier la question et à poser ici?
martial
3
merci d'avoir posé cette question :)
Vidar

Réponses:

157

La CreatedAtRouteméthode est destinée à renvoyer un URI à la ressource nouvellement créée lorsque vous appelez une méthode POST pour stocker un nouvel objet. Donc, si vous POSTEZ un article de commande par exemple, vous pouvez renvoyer une route comme 'api / order / 11' (11 étant évidemment l'identifiant de la commande).

BTW, je suis d'accord que l'article MSDN n'est d'aucune utilité pour comprendre cela. L'itinéraire que vous retournez dépendra naturellement de la configuration de votre itinéraire.

voir plus net
la source
13
Ce qu'il renvoie est en fait un objet CreatedAtRouteNegotiatedContentResult <myObject>! C'est ce que vous verrez si vous exécutez un test unitaire sur votre action. Cependant, lorsqu'il est exécuté dans le contexte de http, il renverra l'objet sérialisé dans le corps, mais vous devriez voir un en-tête dans la réponse avec le lien vers la ressource. BTW si vous pensez que j'ai répondu à la question, pourriez-vous marquer comme réponse? À votre santé.
voir plus net
3
Merci, cela répond à ma question.
martial
2
L'itinéraire que vous avez fourni apparaît en tant qu'en-tête Location dans la réponse. C'est un comportement REST assez typique
Jeff Martin
4
@seesharper Quand le MyObject n'est pas retourné MAIS ... pourquoi dois-je le transmettre à CreatedAtRoute? Que fait la méthode avec?
Elisabeth
6
Existe-t-il un moyen d'utiliser l'itinéraire actuel? Par exemple, si je crée un objet dans le contrôleur de fichiers à l'aide [Route("[controller]")]du contrôleur, que dois-je retourner (pour que l'action GET adjacente puisse être appelée avec l'URL, par exemple)?
Shimmy Weitzhandler
17

Lorsque vous utilisez CreatedAtRoute, le premier argument est le nom de la méthode de Get to the resource. L'astuce qui n'est pas si évidente est que, même avec le nom de méthode correct spécifié, vous devez utiliser le paramètre Name sur l'attribut HttpGet pour que cela fonctionne.

Donc, si le retour dans votre message est le suivant:

return CreatedAtRoute("Get", new { newModel.Id}, newModel);

Ensuite, votre attribut de méthode Get doit ressembler à ceci même si votre méthode est nommée Get:

[HttpGet("{id}", Name = "Get")]

Les appels à votre méthode Post renverront non seulement le nouvel objet (normalement au format JSON), mais également définir l'en-tête Location sur la réponse à l'URI qui obtiendrait cette ressource.

Scott Blasingame
la source
"Cela ne renverra pas seulement le nouvel objet (normalement en tant que JSON), cela définira l'en-tête Location sur la réponse à l'URI qui obtiendrait cette ressource." Par "Ceci", voulez-vous dire HttpGet ou HttpPost? Aussi, que voulez-vous dire par "il définira l'en-tête Location sur la réponse à l'URI qui obtiendrait cette ressource."?
Tran Anh Minh le
"Ceci" faisait référence à la méthode HttpPost (éditez la réponse). En ce qui concerne votre question concernant l'en-tête Location, c'est un en-tête Http que le client peut décider de faire quelque chose avec comme rediriger automatiquement vers lui. C'est un en-tête de réponse Http standard ( en.wikipedia.org/wiki/… ).
Scott Blasingame
Veuillez mettre à jour votre réponse pour inclure également la signification des 2ème et 3ème paramètres.
variable le
0

Dans .net core WebAPI, vous utilisez cette méthode pour renvoyer un code 201, ce qui signifie que l'objet a été créé.

[Microsoft.AspNetCore.Mvc.NonAction]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute (string routeName, object routeValues, object content);

Comme vous pouvez le voir ci-dessus, le CreatedAtRoute peut recevoir 3 paramètres:

routeName Est le nom que vous devez mettre sur la méthode qui sera l'URI qui obtiendra cette ressource après sa création.

routeValues C'est l'objet contenant les valeurs qui seront passées à la méthode GET sur la route nommée. Il sera utilisé pour renvoyer l'objet créé

content C'est l'objet qui a été créé.

L'exemple ci-dessus montre l'implémentation de deux méthodes d'un contrôleur simple avec une méthode GET simple avec le nom lié et la méthode POST qui crée un nouvel objet.

namespace BastterAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CompanyController : Controller
    {
        private ICompanyRepository _companyRepository;

        public CompanyController(ICompanyRepository companyRepository)
        {
            _companyRepository = companyRepository;
        }

        [HttpGet("{id}", Name="GetCompany")]
        public IActionResult GetById(int id)
        {
            Company company = _companyRepository.Find(id);

            if (company == null)
            {
                return NotFound();
            }

            return new ObjectResult(company);

        }

        [HttpPost]
        public IActionResult Create([FromBody] Company company)
        {

            if (company == null)
            {
                return BadRequest();
            }

            _companyRepository.Add(company);

            return CreatedAtRoute("GetCompany", new Company { CompanyID = company.CompanyID }, company);

        }


    }
}

IMPORTANT

  1. Notez que le premier paramètre de CreatedAtRoute (routeName) doit être identique à la définition du Name dans la méthode Get.

  2. L'objet sur le deuxième paramètre devra avoir les champs nécessaires que vous utilisez pour récupérer la ressource sur la méthode Get, vous pouvez dire que c'est un sous-ensemble de l'objet créé lui-même

  3. Le dernier paramètre est l'objet société reçu dans la demande de corps dans sa forme complète.

FINALY

En tant que résultat final, lorsque la publication pour créer une nouvelle entreprise est envoyée à cette API, vous retournerez une route comme 'api / company / {id}' qui vous renverra la ressource nouvellement créée

Bruno Bastos
la source