【发布时间】:2016-10-16 19:05:26
【问题描述】:
这些功能的根本区别是什么?我只知道这三个结果都是 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。在大多数情况下,我想要做的就是返回“应用程序分配”(很可能来自数据库)唯一 id 或我的实体的具有最少信息的版本。
我认为最终,一个 201 响应“应该”创建一个包含新创建资源的 URL 的位置标头,我相信所有 3 个及其重载最终都会这样做。为什么我应该总是返回一个位置标头?我的 JavaScript 客户端、原生移动和桌面应用程序从不使用它。例如,如果我发出 HTTP POST 来创建账单并将其发送给用户,那么这样的位置 URL 会是什么? (我很抱歉没有深入挖掘互联网的历史来寻找答案。)
为什么要为动作和路由命名?动作名和路由名有什么区别?
我对此感到困惑,所以我求助于返回 Ok(),它返回 200,这不适合 POST。
【问题讨论】:
标签: asp.net-web-api http-post asp.net-core asp.net-core-mvc