为什么HTTP GET和POST请求以不同的方式主体与URI将参数传递给服务器?

问题描述

我知道,通常,GET请求通过将查询字符串附加到URI来传递相关参数。 POST请求通过将参数插入请求正文中来传递参数。

我还知道,将GET参数传递到请求正文中被认为是不好的做法,但这并不是对为什么最初实现此行为的解释。据我所知,GET和POST请求之间的主要区别或多或少是语义上的。也就是说,我通常可以假设GET是安全的,而POST不是安全的,这有助于我理解我可以缓存GET结果,并允许GET多次调用而不必担心会在服务器端造成麻烦。这不能解释为什么存在用于传递参数的不同实现。让GET语义上等同于现在使用它,但使用请求主体传递参数而不是URI会不是一个坏主意?同样,HTTP设计人员是否有令人信服的历史原因来划分GET和POST如何存储参数(以这种看似随意的方式)?

解决方法

URL中的数据可以链接,添加书签并轻松共享。

请求正文中的数据可以是 big ,并且可以轻松地包含非文本内容(例如文件附件)。

,

我认为重新整理一下框架而不将其视为参数可能会有所帮助,但请退后一步。

最终,GET请求的目的是向服务器询问给定URI的表示形式。 URI中包含“参数”或“变量”的事实在这里是无关紧要的。

GET请求的想法是,在此URI下给我东西。有一些机制可以动态构建这些URI,这一事实并不重要。

您可以使用POST执行完全相同的操作。您可以GET发送的任何URI,都可以向其发送一个POST请求。因此,POST也可以存在这些URI变量。

因此,从总体上讲,这是请求的目的

GET - Return the representation at the given URI
PUT - Replace the representation at the given URI
DELETE - Remove the resource at the given URI

将这些操作视为您在给定URI上所做的事情,这开始使GET没有请求正文变得有意义。如果请求的目的仅仅是“给我这个uri的东西”,则没有真正的理由拥有尸体。

同样,对于PUT请求以正文进行响应没有多大意义。 PUT的目的是用请求正文替换给定URI上的内容。调用方实际上只需要知道操作是否成功,因此HTTP状态代码就足够了。

对于DELETE,请求响应主体都没有任何意义。您只需要知道有一个URI,就可以调用成功或失败的DELETE操作。

那么POST呢? POST实际上是一个包罗万象的东西,基本上用于“其他”。您不是在明确地替换,删除或检索资源,而是在进行“任意操作”,例如执行RPC调用或在集合中创建新资源。

不同于GETPUTDELETEPOST的含义更为宽松。

POST - Do an arbitrary operation at the given URI.