Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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 GET、PUT和PATCH可以替换为POST HTTP方法吗?_Rest_Http_Restful Url - Fatal编程技术网

Rest GET、PUT和PATCH可以替换为POST HTTP方法吗?

Rest GET、PUT和PATCH可以替换为POST HTTP方法吗?,rest,http,restful-url,Rest,Http,Restful Url,POST、PUT、PATCH和GET都是不同的。幂等元和安全性是关键的区别制造者。 在编写RESTFul API时,我遇到了关于何时何地使用HTTP方法的指导原则。因为我使用Java进行后端实现,所以我可以控制持久数据上HTTP方法的行为。 例如,GET v1/book/{id}可以替换为POST v1/book(主体中带有“id”),现在我可以使用该id对db执行查询,获取特定的图书。(假设具有该id的图书已经存在)。 类似地,我可以实现补丁和POST本身的工作 现在,问题来了,为什么我们不每

POST、PUT、PATCH和GET都是不同的。幂等元和安全性是关键的区别制造者。 在编写RESTFul API时,我遇到了关于何时何地使用HTTP方法的指导原则。因为我使用Java进行后端实现,所以我可以控制持久数据上HTTP方法的行为。 例如,GET v1/book/{id}可以替换为POST v1/book(主体中带有“id”),现在我可以使用该id对db执行查询,获取特定的图书。(假设具有该id的图书已经存在)。 类似地,我可以实现补丁和POST本身的工作

现在,问题来了,为什么我们不每次都使用POST而不是GET、PUT和PATCH,几乎,当我们可以控制后端的幂等和安全行为时

或者,这仅仅是RESTFul文档中提到的一个指南,还是罗伊·菲尔丁(Roy fielding)所说的一个指南,而我们都在盲目地遵循?即使这些指导方针是如此,它们背后的主要思想是什么

上面的参考资料只提到了所有方法的作用或它们的区别。文章中提到的工作原理就好像它们是一些指导原则一样,没有一篇在线文档提到它们背后的原因


没有人会说,如果我使用POST而不是PUT、PATCH和GET,会有什么副作用?(因为我可以控制他们在后端的行为)

如果这样做,就不能说你在“编写RESTFul API”。 任何了解RESTFul标准的人都会对API的行为感到困惑。 如果你符合标准,那么你的生活就会更轻松


毕竟,您的方法并没有真正的好处。

HTTP是一种传输协议,顾名思义,它负责将数据(如文件或数据库条目)通过线路传输到远程系统或从远程系统传输出去。在版本0.9中,基本上只有
GET
操作可供您使用,而在HTTP 1.0中,几乎所有当前操作都添加到规范中

这些方法中的每一种都实现了自己的目的
POST
即根据服务器自身的语义处理有效负载,不管它们是什么。理论上,它可以用于检索、更新或删除内容。不过,对于客户机来说,基本上不清楚服务器对负载的实际作用。无法保证使用该方法调用URI是否安全(远程资源被更改)。设想一个爬虫程序,它只是调用它找到的任何URI,其中一个链接是订单链接或执行支付过程的链接。您真的希望爬虫程序触发您的某个进程吗?规范非常明确,如果发生类似情况,客户不得对此负责。因此,如果爬虫订购了10k产品作为您的链接之一,确实触发了这样一个过程,并且产品是在该过程中创建的,那么您不能向爬虫的维护者申请退款

除此之外,默认情况下,
GET
操作的响应是可缓存的。因此,如果您在一定时间内调用同一资源两次,则可能不需要第二次(第三次,…)再次获取该资源,因为它可以从缓存中重用。如果使用得当,这可以显著降低服务器上的负载

正如你提到的Fielding和REST。REST是一种架构风格,如果您有大量不同的客户端连接到您的服务,而这些客户端又不在您的控制之下,那么您应该使用它。很多所谓的restapi都没有遵循REST,因为它们采用了一种更简单、更实用的RPC方法,使用了外部文档,如Swagger和类似的文档。主要关注的是客户机与服务器的分离,这使得服务器可以自由地发展,而不必担心破坏客户机。另一方面,客户机对变化的反应更加稳健

Fielding只添加了一个REST体系结构必须遵守的内容。其中之一是。虽然Fielding后来写了一篇很好的文章,他解释了API设计者在调用API REST之前需要考虑的内容。只有严格遵守所有约束,才能实现真正的解耦。如果只有一个客户违反了这些前提,那么它就根本不会从REST中受益

REST的主要前提是(并且应该始终是):服务器告诉客户他们需要什么,客户机只使用他们所服务的东西。在可浏览的Web(REST的大表亲)中,服务器将教给客户端,即服务器通过HTML通过Web表单需要什么数据,并用链接关系名称注释链接,以向浏览器提示何时调用该URI。在网页上,垃圾箱图标可能表示删除,而铅笔图标可能表示编辑链接。这种视觉提示也被称为。这种视觉提示可能不适用于机器对机器的通信,尽管这种提示可能会提示它们可能提供的其他东西。设想一个带有
preload
注释的样式表。在HTTP 2中,即服务器可以尝试推送这样的资源,或者在HTTP 1.1中,浏览器可以在仍然解析页面时读取并加载该样式表,以加快速度。为了获得对这些含义的全面了解,这些值应该在一级进行标准化。通过或某些类似的方式,您可以添加新的关系名称,这些名称对于常见情况来说过于具体,但对于域本身来说却是常见的

客户机和服务器的协商也是如此。一般适用的媒体类型可能会比仅由单个公司使用的定制媒体类型获得更广泛的接受。这里的主要目的是达到一个点,即相同的媒体类型可以在不同的领域和API中重用。REST愿景是拥有最少数量的能够与大量服务器或API交互的客户机,类似于能够在其中运行的浏览器