- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这些功能的根本区别是什么?我所知道的是所有三个结果都是 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/
假设有一个创建用户的操作。如果存在指定的电子邮件或用户名,此操作可能会失败。如果它失败了,则需要确切地知道原因。在我看来,有三种方法可以做到这一点,我想知道是否有明显的赢家。 所以,这是一个类用户:
var obj1 = Object.create; console.log(typeof obj1); var obj2 = Object.create(null); console.log(type
I am getting this error after running npm run build yield User.create({^在运行NPM Run Build Year Use
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我正在尝试使用 JDBC(最新版本)设置 SQL Server 2008 数据库。 我有一个我想一起执行的 setup sql 命令列表: 基本上我做的是: connection.setAutoCom
我正在尝试创建一个 CloudFormation 模板来创建一个 Auto Scaling 组,以便我可以从中启动 2 个实例。 我已经创建了 Auto Scaling 组,但我不知道如何编写用于从
我正在创建我的第一个WordPress网站。我已经在我的网站上安装了Elementor Pro插件。随之而来的一个有利因素是“循环旋转木马”。。。当我把它添加到我的页面时,一切似乎都在工作,但是当我点
create-react-app error 我从终端运行yarn start时收到此错误消息...我尝试了sudo killall node和许多其他过程来清除i-node却没有成功。 我也将我的c
在 CRM 中,当我尝试设置工作流程时,我可以选择与某个实体的创建时间相关的超时。涉及三个字段。 记录创建于 创建于 修改时间 虽然最后一个很明显,但我看不出其他两个之间有任何逻辑上的区别。 最佳答案
我在一次采访中被问到这个问题。我无法回答。 "browserslist": [ ">0.2%", "not dead", "not ie <= 11", "not op_mini all" ] 我可以
这是一个 Rails 新手问题: 当我在模型上调用 create() 时,它会绕过关联的 Controller create 操作吗? 例如,这没有命中我的标签 Controller #create
我不明白这两种特权之间的区别。 我找到了这两种解释,但对我没有帮助。 CREATE TABLE -> Enables a user to create a table owned by that us
我是 SharePoint 工作流的新手。 创建新任务并分配 TaskId 时,我有两个选项: 创建一个新字段来保存 TaskId 创建一个新属性来保存 TaskId。 新属性是一个依赖属性。 我的问
我突然注意到我们的代码库中有一个TDataModuleTestExchange(nil)“构造函数调用”: procedure TDialoogConfigExchange.ButtonTestCli
我有一个具有 TComponent 变量的单元,我在单元初始化时创建此组件,如下所示: var XComp: TComponent; . . . . initialization begin
Composer 是否提供了更新项目创建时使用的包的方法?即,如果我使用以下内容创建一个新的 Laravel 项目 composer create-project --prefer-dist lara
在 Hibernate 中,如果我们将 hbm2ddl.auto 设置为 create/create-drop ,那么它将在启动时删除旧模式并创建新模式。这意味着,它也会删除数据?..我的疑问是,如果
我使用了 create an Automated Build 中的此链接 ( this guide ) . 浏览器错误控制台显示: https://hub.docker.com/v2/reposito
我已经搜索了 msdn 并没有找到答案。我应该知道有什么区别吗? 如果真的没有区别,那么为什么会存在这种冗余? --SQL Server Stored Procedure Syntax CREATE
我有以下内容: var CardViewModel = function (data) { ko.mapping.fromJS(data, {}, this); this.editin
我是一名优秀的程序员,十分优秀!