¿Alguien me puede explicar CreatedAtRoute ()?

136

Desde la plantilla para Web API 2, un método de publicación siempre es así:

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

No entiendo este CreatedAtRoute()método. ¿Alguien puede explicarme el CreatedAtRoute()método?

marcial
fuente
25
@ JohnSaunders, por supuesto, encontré esos resultados de Google. Mi problema es que estos documentos no me ayudan a entender este método, después de leerlos, todavía no entiendo. Por eso pregunto aquí.
marcial
11
No quiero que respondas mi pregunta entonces.
marcial
12
Si puedo buscar en Google y encontrar una respuesta, ¿por qué me molesto en dedicar tiempo a editar preguntas y preguntas aquí?
marcial
3
gracias por hacer esta pregunta :)
Vidar

Respuestas:

157

El CreatedAtRoutemétodo está destinado a devolver un URI al recurso recién creado cuando invoca un método POST para almacenar algún objeto nuevo. Entonces, si PUBLICA un artículo de pedido, por ejemplo, puede devolver una ruta como 'api / order / 11' (11 es la identificación del pedido obviamente).

Por cierto, estoy de acuerdo en que el artículo de MSDN no sirve para entender esto. La ruta que realmente regrese dependerá naturalmente de su configuración de enrutamiento.

ver más nítido
fuente
13
¡Lo que devuelve es en realidad un objeto CreatedAtRouteNegotiatedContentResult <myObject>! Eso es lo que verá si ejecuta una prueba de unidad en su acción. Sin embargo, cuando se ejecuta en el contexto de http, devolverá el objeto serializado en el cuerpo, pero debería ver un encabezado en la respuesta con el enlace al recurso. Por cierto, si crees que respondí la pregunta, ¿podrías marcar como respuesta? Salud.
Ve más nítido el
3
Gracias, esto responde a mi pregunta.
marcial
2
La ruta que proporcionó aparece como un encabezado de ubicación en la respuesta. Este es un comportamiento REST bastante típico
Jeff Martin
44
@seesharper Cuando MyObject no se devuelve PERO ... ¿por qué tengo que pasarlo a CreatedAtRoute? ¿Qué está haciendo el método con él?
Elisabeth
66
¿Hay alguna manera de usar la ruta actual? Por ejemplo, si creo un objeto en el controlador de archivos usando [Route("[controller]")]el controlador, ¿qué devuelvo (para que la acción GET adyacente se pueda invocar con la URL, por ejemplo)?
Shimmy Weitzhandler
17

Cuando usa CreatedAtRoute, el primer argumento es el nombre del método de Get to the resource. El truco que no es tan obvio es que, incluso con el nombre correcto del método especificado, debe usar el parámetro Name en el atributo HttpGet para que funcione.

Entonces, si el retorno en su publicación es este:

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

Entonces su atributo de método Get debería verse así, incluso si su método se llama Get:

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

Las llamadas a su método de publicación no solo devolverán el nuevo objeto (normalmente como JSON), sino que establecerán el encabezado de ubicación en la respuesta al URI que obtendría ese recurso.

Scott Blasingame
fuente
"Esto no solo devolverá el nuevo objeto (normalmente como JSON), sino que establecerá el encabezado de ubicación en la respuesta al URI que obtendría ese recurso". Por "Esto", ¿te refieres a HttpGet o HttpPost? Además, ¿qué quiere decir con "establecerá el encabezado Ubicación en la respuesta al URI que obtendría ese recurso"?
Tran Anh Minh
"Esto" se refería al método HttpPost (edite la respuesta). En cuanto a su pregunta con respecto al encabezado de ubicación, ese es un encabezado Http con el que el cliente puede decidir hacer algo con como redirigirlo automáticamente. Es un encabezado de respuesta Http estándar ( en.wikipedia.org/wiki/… ).
Scott Blasingame
¿Puede actualizar su respuesta para incluir también el significado del segundo y tercer parámetro?
variable
0

En .net core WebAPI, utiliza este método para devolver un código 201, lo que significa que se creó el objeto.

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

Como puede ver arriba, el CreatedAtRoute puede recibir 3 parámetros:

routeName Es el nombre que debe poner en el método que será el URI que obtendría ese recurso después de creado.

routeValues Es el objeto que contiene los valores que se pasarán al método GET en la ruta nombrada. Se usará para devolver el objeto creado

contenido Es el objeto que se creó.

El ejemplo anterior muestra la implementación de dos métodos de un controlador simple con un método GET simple con el nombre vinculado y el método POST que crea un nuevo objeto.

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. Observe que el primer parámetro en CreatedAtRoute (routeName) debe ser el mismo en la definición del Nombre en el método Get.

  2. El objeto en el segundo parámetro necesitará tener los campos necesarios que use para recuperar el recurso en el método Get, puede decir que es un subconjunto del objeto creado por sí mismo

  3. El último parámetro es el objeto de empresa recibido en la solicitud del cuerpo en su forma completa.

FINALMENTE

Como resultado final, cuando se publique la publicación para crear una nueva empresa en esta API, devolverá una ruta como 'api / company / {id}' que le devolverá el recurso recién creado

Bruno Bastos
fuente