这些函数的基本区别是什么?我知道的只有所有三个都会产生201,这对于成功的POST请求是合适的。
我只是跟随我在网上看到的例子,但他们并没有真正解释他们为什么要这样做。
我们应该为我们的GET(按ID获取1条记录)提供名称:
[HttpGet("{id}", Name="MyStuff")]
public async Task<IActionResult> GetAsync(int id)
{
return new ObjectResult(new MyStuff(id));
}
除了可能需要下面的POST函数之外,给这个获取函数命名的目的是什么?
给这个获取函数命名的目的是什么,除了它“可能”被下面的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
具有类似的参数。为什么会存在这种变体?
还有一个要求提供URL和要返回的对象的Created
。我能否只使用这个变体并提供虚假URL并返回我想要的对象,以此完成任务?
我不确定为什么有这么多变体只是为了能够向客户端返回201。在大多数情况下,我想做的就是返回“应用分配”的(很可能来自数据库的)唯一ID或具有最少信息的实体版本。
我认为,最终,201响应应该创建一个具有新创建资源的URL的位置标头,我相信所有3种变体及其重载都会这样做。为什么我总是要返回位置标头呢?我的JavaScript客户端、本地移动和桌面应用程序从来没有使用过它。例如,如果我发出HTTP POST来创建账单并将其发送给用户,这样的位置URL将是什么?(对于这个问题,我没有深入挖掘互联网历史,找到答案,感到抱歉。)
为什么要为操作和路由创建名称?操作名称和路由名称之间有什么区别?
我对此感到困惑,所以我只好返回Ok()
,它返回200,这对于POST是不合适的。
Content<T>(HttpStatusCode, T content)
方法以返回状态码和内容。这应该允许返回201和新创建的对象,而无需包含Location
头。 - afrazierStatusCode(int httpStatusCode, object value)
。 - Sock[HttpGet("{id}", Name = "GetUser",Order = 0)]
创建路由的方法似乎不能与CreatedAtRoute()一起使用。 - CrobLocation
头的响应,指向新创建响应的URL,并将对象本身放在响应体中。很抱歉,我无法理解这个。您能否请清楚地解释一下? - Ali Abbasifard