ASP.net Core RC2 Web API POST - Когда использовать Create, CreatedAtAction или CreatedAtRoute?

Каковы фундаментальные различия этих функций? Все, что я знаю, это все три результата в 201, который подходит для успешного запроса POST.

Я следую только за примерами, которые вижу в Интернете, но они на самом деле не объясняют, почему они делают то, что делают.

Мы должны предоставить имя для нашего GET (1 запись по id):

[HttpGet("{id}", Name="MyStuff")]
public async Task<IActionResult> GetAsync(int id)
{
     return new ObjectResult(new MyStuff(id));
}

Какова цель именования этой функции get, кроме того, что она «вероятно» требуется для функции POST ниже:

[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]MyStuff myStuff)
{
     // actual insertion code left out

     return CreatedAtRoute("MyStuff", new { id = myStuff.Id }, myStuff);
}

Я замечаю чтоCreatedAtRoute также имеет перегрузку, которая не принимает в имени маршрута.

Существует такжеCreatedAtAction это принимает в аналогичных параметрах. Почему этот вариант существует?

Существует такжеCreated который ожидает URL и объект, который мы хотим вернуть. Могу ли я просто использовать этот вариант и предоставить фиктивный URL-адрес, а также вернуть нужный объект и выполнить его с помощью?

Я не уверен, почему есть так много вариантов, чтобы иметь возможность вернуть клиенту 201. В большинстве случаев все, что я хочу сделать, - это вернуть «назначенный приложению» (скорее всего из базы данных) уникальный идентификатор или версию моей сущности, которая имеет минимальную информацию.

Я думаю, что в конечном итоге ответ 201 «должен» создать заголовок местоположения, в котором есть URL-адрес недавно созданного ресурса, что, как я полагаю, все 3 и их перегрузки в конечном итоге делают. Почему я всегда должен возвращать заголовок местоположения? Мои клиенты JavaScript, собственные мобильные и настольные приложения никогда не используют его. Если я, например, выдаю HTTP POST для создания выписок по счетам и отправки их пользователям, каким будет такой URL-адрес местоположения? (Мои извинения за то, что я не копался в истории Интернета, чтобы найти ответ на этот вопрос.)

Зачем создавать имена для действий и маршрутов? В чем разница между именами действий и маршрутов?

Я запутался в этом, поэтому я прибег к возвращениюOk(), который возвращает 200, что неуместно для POST.

Ответы на вопрос(1)

Ваш ответ на вопрос