Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对资源执行REST操作_Rest - Fatal编程技术网

对资源执行REST操作

对资源执行REST操作,rest,Rest,假设我有一个资源/entities/1234 实体是集合,1234是实体的id。 实体是数据库记录和服务器上的一组文件。我有一个动作,它构建了一个xml模型和实体的一些其他东西。 我想到了这个: POST/entities/1234/builder {“活动”:“真实”} 但我不确定这是否是一种宁静的方式。认为构建器是实体的子资源是不对的。还是可以 我不认为您的解决方案是可行的,但是在REST中没有标准的方法来实现这一点,所以谁知道呢 我建议通过POST上的自定义标题发送命令。这简化了控制器中的

假设我有一个资源/entities/1234 实体是集合,1234是实体的id。 实体是数据库记录和服务器上的一组文件。我有一个动作,它构建了一个xml模型和实体的一些其他东西。 我想到了这个:

POST/entities/1234/builder

{“活动”:“真实”}


但我不确定这是否是一种宁静的方式。认为构建器是实体的子资源是不对的。还是可以

我不认为您的解决方案是可行的,但是在REST中没有标准的方法来实现这一点,所以谁知道呢

我建议通过POST上的自定义标题发送命令。这简化了控制器中的路由(至少在Spring中简化了路由),不会用破坏随机数据的不可标记缓存感染url,也不会用不应该是对象一部分的不可解析属性感染对象

如果你感兴趣的话,我写过

编辑: 有人可能会争辩说,您最终要对问题中的命令类型做的是更改资源的状态,因此您应该在客户端上更新对象的状态值,然后将修改后的对象发回,让服务器了解如何处理更改。但这并不真正适用于像打印这样的命令

术语“建设者”有点奇怪,但你的方法不会产生任何我能想到的负面影响。好吧,除了使缓存失效更加困难之外,大多数方法可能都是这样

就我个人而言,我会

  POST /entities/1234/activator

使用空的主体,这样我就不必担心主体的格式和解析。然而,这取决于在web框架中创建新资源的容易程度

另一种方法是

  POST /EntityActivator
  Content-Type: text/uri-list

  http://example.org/entities/1234
  http://example.org/entities/1237

这种方法的优点是可以进行“批量”激活和停用。这完全取决于您的激活码是否是所有实体的通用激活码,或者您是否具有特定于实体的激活码。

那么您想以post正文的形式提交命令吗?如果没有{“active”:“true”},“POST/entities/1234/builder”怎么办?欢迎使用REST。如果你最终为此定义了一个标准,请让我知道,因为我真的很想有一个标准的方法来做这件事。而且,如果您认为这很难做到,请等到您点击乐观锁定:)@EngineerDollery其余规则很简单,如果您不能做一些事情,请创建一个新的资源来做。是的,我知道这通常并不简单。就乐观锁定而言,这从来都不容易,但至少我们有409和条件写入请求。因此,基本上我在/entities/1234上发布了一个带有自定义头的空正文?将自定义命令放在头中可能是最不明显的事情,尽管它确实消除了一些问题。您所说的“最不明显”是什么意思?我不知道你说的“明显”是什么意思。@user1745356——是的,这是我的方法。这件事还不是很清楚,现在所有的方法都有权衡,但这是我遇到类似问题时能想到的最好办法。如果你在资源上发帖,为什么在体内发送命令会“感染”呢“你的目标是什么?你根本不需要发送你的对象。如果我在RESTAPI上看到一个url,我希望它指向一个资源,而不是调用远程方法的简单方式。如果我看到resource/activator,那么我希望能够访问activator子资源。当您的解决方案工作时,它会用非rest URL污染rest api,因此会降低其直观性并降低您的rest成熟度。我同意这并不可怕,但是如果你想做rest,这不是正确的方法——这只是一个远程过程调用*注意:我不知道正确的方法是什么,但当我看到它时,我可以识别出错误:)@EngineerDollery没有“rest url”这样的东西。这是一种谬论。我在服务器上定义了一个资源,并为其指定了标识符
/entities/1234/activator
。这与“/entities/1234”@EngineerDollery一样有效。当尝试确定某个内容是否为“RESTful”时,确定是否违反了任何约束以及违反这些约束的影响是很重要的。使用带有资源的POST对相关资源进行更改是HTTP的一种完全有效的用法。仅仅因为你在URL中看到一个动词并不意味着它就像RPC调用一样被使用。我认为我们对此有着根本不同的看法,因此我们进行了讨论。正如我在回答中所说,没有标准,所以没有对错。考虑到这一点,这个问题的答案是基于意见的,它可能应该在这个基础上结束,但我认为这是一个非常好的问题和有益的讨论,我不忍心投票结束它。但是,它可能不符合SO标准,而且您的代表性比我强,所以您可能知道得更好,您认为如何?@EngineerDollery REST的约束条件在这里有记录,我相信这里的问题是有效的,应该保留。您可能会觉得这是一个意见问题,但我很确定,如果您搜索REST和RPC之间的区别,我可能已经回答过几次了。
  POST /EntityActivator
  Content-Type: text/uri-list

  http://example.org/entities/1234
  http://example.org/entities/1237