Language agnostic 哪个动词应该用于自定义操作?

Language agnostic 哪个动词应该用于自定义操作?,language-agnostic,rest,Language Agnostic,Rest,假设我们有一个站点,其中有一个项目列表。对于这些项目中的每一项,您都可以启动两个不同的过程,从而产生与所讨论的项目相关的某种输出。您应该如何设计http谓词的最适当使用?我希望每个项目有多个链接,每个链接触发一个操作,但在我的场景中,与HTTP-VERB get不匹配,如果我使用链接,将使用HTTP-VERB get。另一方面,我不想有按钮,所有的按钮都是在一个单独的形式与不同的行动 这有点难以解释,但希望您能理解,这里应该应用一些最佳实践。过去,我使用POST和查询参数来指定自定义操作。这在我

假设我们有一个站点,其中有一个项目列表。对于这些项目中的每一项,您都可以启动两个不同的过程,从而产生与所讨论的项目相关的某种输出。您应该如何设计http谓词的最适当使用?我希望每个项目有多个链接,每个链接触发一个操作,但在我的场景中,与HTTP-VERB get不匹配,如果我使用链接,将使用HTTP-VERB get。另一方面,我不想有按钮,所有的按钮都是在一个单独的形式与不同的行动


这有点难以解释,但希望您能理解,这里应该应用一些最佳实践。

过去,我使用POST和查询参数来指定自定义操作。这在我的用例中是有意义的,因为我有大多数自定义操作需要传递有效负载。因为您不想使用按钮,所以可以使用GET和查询参数来指定不同的操作,但是您必须非常小心,您正在执行的操作没有任何副作用,并且是幂等的。正如@jhericks在下面的评论中所指出的,网络中有很多东西假设GET是安全的,并且可能重复GET


但从纯粹的宁静角度来看,这并不理想。您的项目将有一个特定的URI,获取URI将返回项目表示。对项目运行操作实际上是对项目表示状态的更改,这应该通过POST(或PUT)来完成,具体取决于您询问的对象以及您的web服务器是否支持PUT)。然而,在现实生活中,使用查询参数是一个很容易解决的问题,它可能对您的用例有意义。

您不应该使用GET。GET请求应为,这意味着它们仅用于信息检索,不应更改服务器的状态。(也就是说,像日志记录这样的事情是可以的,但实际上更新应用程序状态的事情是不可以的)想象一下爬虫在你的应用程序上运行。任何你不介意爬虫程序进行的操作都适合GET,但这听起来不像你的情况(因为你说“启动两个不同的过程”,但我可能误解了你的用例)

这就剩下了PUT、DELETE和POST。PUT和DELETE必须为,这意味着多个相同的请求应具有与单个请求相同的效果。因此,如果您有一个更新了某人姓名的请求,例如,如果您调用它一次或100次,该人的姓名仍然是相同的,因此它是幂等的

POST是最灵活的动词。如果您启动的进程不安全或幂等(或者即使它们是),您可以使用POST,它根本不能保证任何安全或幂等性。缺点是:

  • 如果在GET的语义更正确时使用POST,则请求的意图就不那么容易传达,因为POST通常意味着您正在发送有效负载
  • 你就是不能利用网络的缓存基础设施,使它如此可扩展

    • 我不确定我是否完全理解你的问题

      但这里有一个简短的段落可能会对你有所帮助

      REST是关于制造智能客户端和简单服务器的。GET、PUT、DELETE表示最低级别的文件访问的基本操作。您应该做的是完全忽略服务器可以提供的任何内容,并将这些工作转移到客户端

      所以,问题是,为什么服务器会被触发去做很多事情。为什么客户不能自己做所有这些事情呢


      迈克·布朗(Mike Brown)

      关于蜘蛛和一般好想法的捕捉很好,你没有误解我。然而,在我所描述的场景中,你的建议是将每个项目“包装”在一个表单中,然后对所有按钮(或我提交表单的内容)使用post,并让每个按钮代表不同的操作?对我来说,http动词不太适合事件驱动的UI。我想我考虑的是服务器API而不是UI。您可以为每个表单元素创建一个链接,您要提交的每个值都是一个隐藏元素,唯一可见的是图像的输入类型。你也可以有一个由JavaScript提交的隐藏表单,并通过点击一个链接触发JavaScript,这样用户会觉得它就像你一开始想做的一样——一组链接。当然,我可以让JavaScript帮我完成这项工作,但问题是,如果不启用javascript,我想知道如何解决这个问题。你仍然可以使用图像按钮而不是表单按钮,但是是的,如果没有javascript,我能想到的唯一方法就是做一个表单发布。在这种情况下,这不是最准确的动词,因为我没有创建。列表是否会因为这个过程而改变?你能更具体地说明你对这些名单做了什么吗?否决投票,因为这绝对不是一个武断的选择。POST总是可以用来代替GET(尽管这样做会失去GET的一些优势),但GET必须是安全的,所以不能随意用GET请求替换POST请求。浏览器、爬虫程序和代理都假定GET是安全的,因此,例如,googledesktop加速器可能只是按照链接预先获取数据,以备需要。如果GET请求有很多副作用(甚至是直接影响),而你只想在用户明确决定执行时运行这些副作用,那就太糟糕了。没错,我会修改我的答案。在绝大多数情况下,RESTful系统在服务器上的智能性更强,而在客户端上的智能性更低。