Saltar al contenido

Cómo utilizar Created (o CreatedAtAction / CreatedAtRoute) en una API de asp net core

Solución:

En su ruta para el método Get, tome tanto el / principal como el $ out (es decir, debería ser “{id}”). Tener el encabezado / dentro significa que la ruta será relativa a la base de la aplicación; sacarlo hace que la ruta del método sea relativa a la ruta base del controlador. El $ se trata como un carácter literal en la ruta, de ahí la razón por la que aparecía en el encabezado Ubicación en Intento 1. Una vez que haya realizado los cambios, debería encontrar que su llamada CreatedAtRoute funciona como es de esperar.

CreatedAtAction da el mejor resultado en mi opinión. El siguiente código de controlador hará lo que necesite:

[Route("api/products")]
[ApiController]
public class ProductsController : ControllerBase
{
    private readonly IProductRepository productRepository;

    public ProductsController(IProductRepository productRepository)
    {
        this.productRepository = productRepository;
    }

    [HttpPost]
    [Route("")]
    [ProducesResponseType(StatusCodes.Status201Created)]
    public ActionResult<Product> CreateProduct(ProductCreateDto product)
    {
        if (product is null)
            return BadRequest(new ArgumentNullException());

        var entity = productRepository.CreateProduct(product);

        return CreatedAtAction(nameof(GetProduct), new { id = entity.ID }, entity);
    }

    [HttpGet]
    [Route("{id}")]
    public ActionResult<Product> GetProduct(int id)
    {
        return productRepository.GetProduct(id);
    }
}

Emitiendo la siguiente solicitud:

POST http://localhost:5000/api/products HTTP/1.1 
Host: localhost:5000
Connection: keep-alive 
Content-Length: 25 
Content-Type: application/json

{ "name": "ACME Widget" }

Dará la siguiente respuesta:

HTTP/1.1 201 Created
Date: Mon, 12 Oct 2020 09:50:00 GMT
Content-Type: application/json; charset=utf-8
Server: Kestrel
Content-Length: 29
Location: http://localhost:5000/api/products/1

{"id":1,"name":"ACME Widget"}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *