Как использовать Created (или CreatedAtAction / CreatedAtRoute) в asp net core api

Я хотел бы сообщить потребителям моего api о местоположении вновь созданного объекта. Я знаю, что есть Created() CreatedAtRoute() и CreatedAtAction() но я не уверен, как использовать его.

вот что я пробовал:

у меня есть Get ресурс, на который я хотел бы отметить. Он принимает идентификатор в качестве ввода:

    [HttpGet("/${id}", Name = "GetProduct")]
    [ProducesResponseType(typeof(Produkt), 200)]
    public IActionResult Get([FromRoute] int id)
    {
       // some code...
        return Ok(...);
    }

когда продукт создается через my в должности маршрут, я хотел бы указать на этот ресурс по размещению заголовок:

Попытка 1

    [HttpPost]
    [ProducesResponseType(typeof(Produkt), 200)]
    public IActionResult CreateNewProduct([FromBody] ProduktDtoForCreate productFromBody)
    {
        //...
        return CreatedAtRoute("GetProduct", new { id = productToCreate.Id }, productToCreate);
    }

возвращает Расположение Заголовка of:http://localhost:5000/15003$

Попытка 2

    [HttpPost]
    [ProducesResponseType(typeof(Produkt), 200)]
    public IActionResult CreateNewProduct([FromBody] ProduktDtoForCreate productFromBody)
    {
        //...
        return Created(new Uri($"{Request.Path}/{productToCreate.Id}", UriKind.Relative), productToCreate);
    }

это работает и возвращает / api / v1.0 / produkte / 16004 но похоже, что использование текущего запроса для указания нового местоположения не требуется. Также я не уверен, что это хорошая практика?

1 ответов


в вашем маршруте для метода Get возьмите как ведущий /, так и $ out (т. е. он должен быть просто "{id}"). Наличие ведущего / в там означает, что маршрут будет относительно базы приложения; принимая его, делает маршрут для метода относительно базового пути контроллера вместо этого. $ Рассматривается как литеральный символ в маршруте, поэтому он появлялся в заголовке местоположения при попытке 1. После того как вы сделали изменения, вы должны найти, что ваш Вызов CreatedAtRoute работает так, как вы ожидаете.