Как использовать 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 работает так, как вы ожидаете.