gpt4 book ai didi

asp.net-web-api - ASP.net Core RC2 Web API POST - 何时使用 Create、CreatedAtAction 与 CreatedAtRoute?

转载 作者:行者123 更新时间:2023-12-01 16:25:39 24 4
gpt4 key购买 nike

这些功能的根本区别是什么?我所知道的是所有三个结果都是 201,这适合成功的 POST 请求。

我只遵循在网上看到的示例,但它们并没有真正解释他们为什么要做他们正在做的事情。

我们应该为 GET 提供一个名称(按 id 记录 1 条记录):

[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 响应“应该”创建一个位置 header ,其中包含新创建资源的 URL,我相信所有 3 个资源及其重载最终都会这样做。为什么我应该始终返回位置 header ?我的 JavaScript 客户端、 native 移动和桌面应用程序从不使用它。例如,如果我发出 HTTP POST 来创建帐单并将其发送给用户,那么这样的位置 URL 会是什么? (我很抱歉没有深入研究互联网的历史来找到这个问题的答案。)

为什么要为操作和路由创建名称?操作名称和路由名称有什么区别?

我对此感到困惑,因此我求助于返回 Ok(),它返回 200,这对于 POST 来说是不合适的。

最佳答案

这里有几个不同的问题,可能应该分开,但我认为这涵盖了您的大部分问题。

为什么要为操作和路由创建名称?操作名称和路由名称有什么区别?

首先, Action 和路线有很大不同。

Action 存在于 Controller 上。路由指定一个完整的端点,由 Controller 、操作和可能的其他路由参数组成。

您可以为路线命名,以便您在应用程序中引用它。例如

routes.MapRoute(
name: "MyRouteName",
url: "SomePrefix/{action}/{id}",
defaults: new { controller = "Section", action = "Index" }
);

此问题涵盖了操作名称的原因:Purpose of ActionName

It allows you to start your action with a number or include any character that .net does not allow in an identifier. - The most common reason is it allows you have two Actions with the same signature (see the GET/POST Delete actions of any scaffolded controller)

这些功能的根本区别是什么?

这 3 个函数本质上都执行相同的函数 - 返回 201 Created响应,带有 Location header 指向新创建的响应的 url,以及主体中的对象本身。 url 应该是 GET 请求返回对象 url 的 url。这将被视为 RESTful 系统中的“正确”行为。

对于您问题中的示例邮政编码,您实际上希望使用 CreatedAtAction .

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

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

假设您配置了默认路由,这将添加一个指向 MyStuff 的 Location header 在同一 Controller 上执行操作。

如果您希望位置 url 指向特定路线(如我们之前定义的,您可以使用例如

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

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

我可以使用此变体并提供虚假 URL 并返回我想要的对象并完成它吗?

如果你真的不想使用CreatedResult ,您可以使用简单的 StatusCodeResult ,这将返回 201,不带 Location header 或正文。

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

return StatusCode(201);
}

关于asp.net-web-api - ASP.net Core RC2 Web API POST - 何时使用 Create、CreatedAtAction 与 CreatedAtRoute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37839278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com