Qualcuno può spiegare CreatedAtRoute () per me?


136

Dal modello per Web API 2, un metodo post è sempre così:

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

Non capisco questo CreatedAtRoute()metodo. Qualcuno può spiegarmi il CreatedAtRoute()metodo?


25
@JohnSaunders ovviamente ho trovato quei risultati su Google. Il mio problema è che questi documenti non mi aiutano a capire questo metodo, dopo averli letti, ancora non capisco. Ecco perché chiedo qui.
marziale

11
Allora non rispondo alla mia domanda.
marziale

12
Se riesco a trovare Google e trovare una risposta, perché dovrei preoccuparmi di dedicare del tempo a modificare le domande e porre qui?
marziale

3
grazie per aver posto questa domanda :)
Vidar,

Risposte:


157

Il CreatedAtRoutemetodo ha lo scopo di restituire un URI alla risorsa appena creata quando si richiama un metodo POST per memorizzare un nuovo oggetto. Quindi, se POST un articolo dell'ordine, ad esempio, potresti restituire un percorso come 'api / order / 11' (11 è ovviamente l'ID dell'ordine).

A proposito, sono d'accordo che l'articolo di MSDN non è di alcuna utilità per comprenderlo. Il percorso effettivamente restituito dipenderà naturalmente dalla configurazione del tuo percorso.


13
Ciò che restituisce è in realtà un oggetto CreatedAtRouteNegotiatedContentResult <myObject>! Questo è ciò che vedrai se esegui un test unitario sulla tua azione. Tuttavia, quando eseguito nel contesto di http, restituirà l'oggetto serializzato nel corpo, ma dovresti vedere un'intestazione nella risposta con il collegamento alla risorsa. A proposito, se pensi che ho risposto alla domanda, potresti segnare come risposta? Saluti.
vedi più nitido il

3
Grazie, questo risponde alla mia domanda.
marziale

2
Il percorso fornito viene visualizzato come intestazione della posizione nella risposta. Questo è un comportamento REST abbastanza tipico
Jeff Martin,

4
@seesharper Quando MyObject non viene restituito MA ... perché devo passarlo a CreatedAtRoute? Cosa ci fa il metodo?
Elisabeth,

6
C'è un modo per utilizzare il percorso corrente? Ad esempio, se creo un oggetto nel controller di file utilizzando [Route("[controller]")]sul controller, cosa restituisco (in modo che l'azione GET adiacente possa essere invocata con l'URL, per esempio)?
Shimmy Weitzhandler il

17

Quando si utilizza CreatedAtRoute, il primo argomento è il nome del metodo Ottieni nella risorsa. Il trucco che non è così ovvio è che, anche con il nome del metodo corretto specificato, è necessario utilizzare il parametro Name sull'attributo HttpGet affinché funzioni.

Quindi se il ritorno nel tuo post è questo:

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

Quindi l'attributo del metodo Get dovrebbe apparire così anche se il tuo metodo è chiamato Get:

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

Le chiamate al tuo metodo Post non solo restituiranno il nuovo oggetto (normalmente come JSON), ma imposteranno l'intestazione Location sulla risposta all'URI che otterrebbe quella risorsa.


"Questo non solo restituirà il nuovo oggetto (normalmente come JSON), ma imposterà l'intestazione Location sulla risposta all'URI che otterrebbe quella risorsa." Con "Questo" intendi HttpGet o HttpPost? Inoltre, cosa intendi con "imposterà l'intestazione della posizione sulla risposta all'URI che otterrebbe quella risorsa"?
Tran Anh Minh,

"Questo" si riferiva al metodo HttpPost (modifica la risposta). Per quanto riguarda la tua domanda sull'intestazione della posizione, questa è un'intestazione Http con cui il cliente può decidere di fare qualcosa con un reindirizzamento automatico su di esso. È un'intestazione di risposta Http standard ( en.wikipedia.org/wiki/… ).
Scott Blasingame,

Puoi aggiornare la tua risposta per includere anche il significato del secondo e terzo parametro.
variabile dal

0

Nell'API Web di base .net, questo metodo viene utilizzato per restituire un codice 201, il che significa che l'oggetto è stato creato.

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

Come puoi vedere sopra, CreatedAtRoute può ricevere 3 parametri:

routeName È il nome che è necessario inserire nel metodo che sarà l'URI che otterrà quella risorsa dopo la creazione.

routeValues È l'oggetto che contiene i valori che verranno passati al metodo GET sulla route denominata. Verrà utilizzato per restituire l'oggetto creato

contenuto È l'oggetto che è stato creato.

L'esempio sopra mostra l'implementazione di due metodi di un semplice controller con un semplice metodo GET con il nome associato e il metodo POST che crea un nuovo oggetto.

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);

        }


    }
}

IMPORTANTE

  1. Si noti che il primo parametro in CreatedAtRoute (routeName), deve essere lo stesso nella definizione del nome nel metodo Get.

  2. L'oggetto sul secondo parametro dovrà avere i campi necessari che usi per recuperare la risorsa sul metodo Get, puoi dire che è un sottoinsieme dell'oggetto creato da solo

  3. L'ultimo parametro è l'oggetto società ricevuto nella richiesta del corpo nella sua forma completa.

Finaly

Come risultato finale, quando Post per creare una nuova società è stato creato per questa API, restituirai una rotta come 'api / company / {id}' che ti restituirà la risorsa appena creata

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.