HTTP协议中的诸如GET和POST之类的方法有什么需求?


17

我们不能仅使用请求正文和响应正文来实现HTTP协议吗?

例如,URL将包含请求,该请求将根据服务器端的编程语言(例如Servlet)映射到一个函数,并作为响应发送HTML和JavaScript响应。

为什么HTTP协议具有方法概念?

从答案中,我对为什么有方法的概念有了一定的了解。这引出了另一个相关的问题:

例如,在gmail compose链接中,将发送PUT / POST请求和数据。浏览器如何知道要使用哪种方法?服务器发送的gmail页面是否包含调用gmail compose请求时要使用的方法名称?当我们调用www.gmail.com时,必须使用GET方法,浏览器如何知道要使用此方法?

PS我没有足够的学分来评论答案,因此我无法评论与该问题背后意图相关的人员提出的许多问题。

就像一些答案说的那样,我们可以在DELETE方法上创建新用户,这引起了对HTTP协议中方法概念背后的意图的质疑,因为归根结底,这完全取决于服务器他们要将URL映射到什么功能。 。客户为什么要告诉服务器URL使用什么方法。


是的,没有。您说自己想知道如何在不使用HTTP的情况下发出HTTP请求时,您的问题就与自己发生了冲突,但是我想我知道您正在尝试做的事情。也就是说,GET和POST数据无需使用浏览器,而是通过编程方式进行。那是对的吗?
罗布

4
我想知道,您是否在问是否可以在没有方法的情况下定义HTTP,即方法的历史依据?还是如果没有它们就可以使用当前协议,即丢弃方法是否在现有规范之内?
ilkkachu

@ilkkachu:为什么客户端需要告诉服务器如何执行某些操作。客户端只会请求一个URL并使用URL,例如服务器可以将其映射到一个称为servlet的函数并提供响应。为什么客户应该需要提供如何执行某些东西?
user104656

1
@ user104656,如果这是我的问题的答案,我仍然不确定您是原始设计还是当前情况。(我没有说它需要或不需要。)
ilkkachu

@Mars和其他:例如,在gmail compose链接中,将发送PUT / POST请求和数据。浏览器如何知道要使用哪种方法?服务器发送的gmail页面是否包含调用gmail compose请求时要使用的方法名称?当我们调用www.gmail.com时,必须使用GET方法,浏览器如何知道要使用此方法?
BioLogic

Answers:


33

请注意,自首次编写此答案以来,问题已更改/已得到澄清。对问题的最新迭代的进一步响应是在第二条水平规则之后

HTTP协议中的诸如GET和POST之类的方法有什么需求?

它们以及其他一些信息,例如标头格式,标头和正文如何分离的规则,构成了HTTP协议的基础。

我们不能仅使用请求正文和响应正文来实现HTTP协议吗?

不,因为那样创建的内容都不是HTTP协议

例如,URL将包含请求,该请求将根据服务器端的编程语言(例如Servlet)映射到一个函数,并作为响应发送HTML和JavaScript响应。

恭喜,您刚刚发明了新协议!现在,如果您想建立一个标准机构来驱动和维护,开发它,等等,那么它有一天可能会超过HTTP

我很欣赏这句话,但对于Internet,TCP / IP或服务器与客户端之间进行的通信并没有什么神奇的。您打开一个连接并通过网络发送一些单词,形成对话。如果要理解请求并提供明智的响应,对话实际上必须在两端遵守一些已批准的规范。这与世界上的任何对话都没有什么不同。你说英语,邻居说汉语。希望您的手挥动,指向和拳头摇晃足以传达您的信息,即您不希望他将汽车停在您家门前。

返回互联网,如果您打开了一个与HTTP兼容的Web服务器的套接字并发送以下信息:

EHLO
AUTH LOGIN

(SMTP电子邮件传输的开始),那么您将不会得到明智的答案。您可以制作最完美的SMTP兼容客户端,但是您的Web服务器不会与之对话,因为此对话只涉及共享协议-无共享协议,无聊。

这就是为什么如果不实现HTTP协议就无法实现HTTP协议的原因。如果您编写的内容不符合协议,那么就根本不是协议-它是另外一回事,它将无法按照协议中的规定进行操作

如果我们用您的例子来讨论一下;客户端连接并仅声明类似于URL的位置。服务器理解它并仅发送类似于HTML / JS(网页)的内容,那么可以正常工作。你存了什么?关于不说GET的几个字节?放弃这些令人讨厌的标题的方法很少。服务器也保存了一些标题-但是如果您无法弄清楚它发送给您的内容怎么办?如果您要求输入一个以JPEG结尾的URL,并且它向您发送了一些构成图片的字节,但使用PNG,该怎么办?当时的PNG不完整。如果我们只有一个标头,说它要去多少字节发送,那么我们就会知道接收到的字节数实际上是否是整个文件。如果服务器压缩响应以节省一些带宽却没有告诉您怎么办?您将花费一些可观的计算能力来计算发送的内容。

最终,我们需要元信息-有关信息的信息;我们需要标题;我们需要文件具有名称,扩展名和创建日期。我们需要人们过生日,如要致以问候和感谢,等等-世界上充满了协议和有关上下文的信息,因此我们不必坐下来从头开始工作。它花费了一些存储空间,但是很值得


确实需要实现各种HTTP方法吗?

可以说,人们不必实现整个指定的协议,通常对于任何情况都是如此。我不知道英语中的每个单词;我的中国邻居也是一名软件开发人员,但是在不同的行业中,对于我在该行业中使用的某些术语,他甚至都不了解中文,更不用说英语。不过,好事是,我们俩都可以拿起有关HTTP实现的文档,他可以编写服务器,而我可以编写客户端,并且可以在不同的体系结构上使用不同的编程语言,并且它们仍然有效,因为它们遵循协议

很有可能情况是,您的用户将不会发出除GET请求之外的任何东西,不会使用持久连接,将JSON以外的任何内容作为正文发送,或需要接受除text / plain之外的任何内容,因此您可以编写一个真正精简的Web服务器,该服务器只能满足客户端浏览器非常有限的需求。但是您不能随意决定取消使“某些文本通过套接字”成为HTTP的基本规则。您不能放弃以下基本概念:请求将是一个字符串,例如:

VERB URL VERSION
header: value

maybe_body

响应中将包含一个版本,状态代码以及标题。如果您更改了其中的任何内容-不再是HTTP-则是其他内容,并且只能与旨在理解它的内容一起使用。这些定义就是HTTP的含义,因此,如果要实现HTTP,则必须遵循这些定义


更新资料

您的问题有所发展,以下是对您所提出问题的一些答复:

为什么HTTP协议具有方法概念?

从历史上看,您需要认识到事情在设计和实现上更加僵化,甚至不存在脚本的程度,甚至认为页面可以是动态的,都是在内存中动态生成并向下推套接字的观念。客户端请求并读取并向下推送套接字的磁盘上的静态文件的状态不存在。这样一来,早期的网络就集中在包含链接到其他页面的静态页面的概念上,所有页面都存在于磁盘上,并且导航本来是由终端主要通过URL请求GET请求的,服务器才能进行映射网址到磁盘上的文件并发送。还有一种想法是,相互链接并链接到其他地方的文档网络应该是不断发展的,

这为这些方法提供了一些历史背景-曾几何时,URL是不灵活的位,并且简单地引用磁盘上的页面,因此该方法很有用,因为它允许客户端描述其对文件的意图,而服务器将以某种不同的方式处理该方法。在超文本(实际上仅是文本)网络的原始视觉中,实际上并没有URL是虚拟的或用于切换或映射的概念。

我不希望这个答案成为具有日期的历史记录的文档,并引用了事情何时开始发生变化的确切参考(为此您可能可以阅读Wikipedia),但这足以说明随着时间的推移Web的发展势头越来越大,在服务器-客户端连接的每一端,我们正在扩展创造丰富的多媒体体验的机会。浏览器支持用于格式化内容的大量标签,每个浏览器都在竞相实现必需的媒体丰富功能以及使事物看起来时髦的新方法。

脚本到达客户端,插件和浏览器扩展,所有这些都是为了使浏览器成为功能强大的所有功能。在服务器端,基于算法或数据库数据的内容主动生成是最大的推动力,并且它继续发展到磁盘上几乎没有文件的程度-当然,我们将图片或脚本文件保留为文件Web服务器并具有浏览器GET,但是越来越多的浏览器显示的图片和运行的脚本不是您可以在文件资源管理器中打开的文件,它们是生成的内容,是按需完成的一些编译过程的输出,描述如何绘制像素(而不是像素的位图数组)的SVG或从诸如TypeScript的更高级形式的脚本中发出的JavaScript

在制作现代的数兆字节的页面时,现在大概只有一小部分是磁盘上的固定内容。将数据库数据格式化并整形为HTML,供浏览器使用,并由服务器完成,以响应url以某种方式引用了多个不同的编程例程

我在对问题的评论中提到,这有点像一个完整的圈子。当计算机耗费成千上万个房间时,通常是允许多个用户通过数百个笨拙的终端使用一个超级强大的中央大型机-键盘和鼠标,绿屏,发送一些文本,获取一些信息。发短信。随着时间的推移,随着计算能力的提高和价格的下降,人们开始使用台式计算机,而台式计算机的功能要比早期大型机强大,并且可以在本地运行强大的应用程序,因此大型机模型已经过时了。不过,它从未消失,因为事情发展了另一种方式,并在某种程度上恢复为提供大多数有用的应用程序功能的中央服务器,以及数百台客户端计算机,它们只在屏幕上绘图,几乎没有什么作用,并向服务器提交数据或从服务器接收数据。在这段过渡时期内,您的计算机足够聪明,可以同时运行自己的单词和Outlook副本,这又再次让位给了在线办公,您的浏览器是一种用于在屏幕上绘制图片并编辑您​​的文档/电子邮件的设备重新编写为驻留在服务器上的东西,然后将其保存在服务器上,发送给其他用户并与其他用户共享,这是因为浏览器只是一个外壳,可在任何时候提供部分视图,而该东西驻留在其他地方

从答案中,我对为什么有方法的概念有了一定的了解。这引出了另一个相关的问题:

例如,在gmail compose链接中,将发送PUT / POST请求和数据。浏览器如何知道要使用哪种方法?

默认情况下,它使用GET,按照约定/规范,因为这是您键入url并按return时将发生的命令

服务器发送的gmail页面是否包含调用gmail compose请求时要使用的方法名称?

这是我在上面的评论中提到的关键内容之一。在现代网络中,页面甚至都不再相关。一旦页面成为磁盘上的文件,浏览器就会获取。然后,它们变成了主要通过将数据放入模板中而动态生成的页面。但是它仍然涉及“从服务器请求新页面,获取页面,显示页面”的过程。页面交换真的很流畅;您没有看到它们加载,调整大小和颠簸它们的布局,因此看上去更平滑,但仍然是浏览器用另一个页面替换整个页面或页面的一部分

现代的做事方式是使用单页应用程序。浏览器在内存中有一个以某种方式显示的文档,脚本调用了thebservr并获取了一些信息,然后对文档进行了处理,以使页面的一部分以可视方式更改以显示新信息-整个过程不会浏览器曾经加载另一个新页面;它只是成为一个UI,其中的部分内容就像典型的客户端应用程序(如word或Outlook)一样进行更新。新元素会出现在其他元素的顶部,并且可以在模拟对话框窗口等周围拖动。所有这些都是浏览器脚本引擎使用开发人员想要的任何http方法发送请求,取回数据并查看浏览器正在绘制的文档。您可以认为现代浏览器是一种出色的设备,类似于整个操作系统或虚拟计算机。一种可编程设备,具有相当标准化的方式来在屏幕上绘制事物,播放声音,捕获用户输入并将其发送进行处理。使它绘制UI所需要做的就是为它提供一些html / css,使它成为UI,然后不断调整html以使浏览器更改其绘制的内容。哎呀,人们习惯于看到地址栏的更改/将其用作意图的方向,即使没有导航(请求整个新页面),单个页面的应用程序也会以编程方式更改网址 使它绘制UI所需要做的就是为它提供一些html / css,使它成为UI,然后不断调整html以使浏览器更改其绘制的内容。哎呀,人们习惯于看到地址栏的更改/将其用作意图的方向,即使没有导航(请求整个新页面),单个页面的应用程序也会以编程方式更改网址 使它绘制UI所需要做的就是为它提供一些html / css,使它成为UI,然后不断调整html以使浏览器更改其绘制的内容。哎呀,人们习惯于看到地址栏的更改/将其用作意图的方向,即使没有导航(请求整个新页面),单个页面的应用程序也会以编程方式更改网址

当我们调用www.gmail.com时,必须使用GET方法,浏览器如何知道要使用此方法?

真正。因为它是指定的。第一个请求是因为它一直以来都是-获取一些初始html来绘制UI,然后永久性地对其进行戳戳和操作,或者使用其他脚本来获取另一个页面以进行戳戳和操作并制作响应式UI

就像一些答案说的那样,我们可以在DELETE方法上创建新用户,这引起了对HTTP协议中方法概念背后的意图的质疑,因为归根结底,这完全取决于服务器他们要将URL映射到什么功能。 。客户为什么要告诉服务器URL使用什么方法。

历史。遗产。从理论上讲,我们明天可以扔掉所有的http方法-我们处于编程成熟度级别,在这里,方法已经过时了,因为URL是可处理的,在某种程度上它们可以作为向服务器指示要保存数据的切换机制。正文作为草稿电子邮件,或删除草稿-服务器上没有/ emails / draft / save / 1234文件-对该服务器进行了编程,可以将网址分开,并知道如何处理正文数据-保存它作为ID为1234的草稿电子邮件

因此,除了方法产生的巨大的遗留兼容性之外,当然可以取消方法。最好仅将它们用于所需的内容,而在很大程度上忽略它们,而使用所需的任何东西使它们正常工作。我们仍然需要如此高级的方法,因为您必须记住,它们对于我们创建应用程序的浏览器和服务器都具有重要意义。客户端脚本希望使用基础浏览器发送数据,它需要使用一种方法来使浏览器按其要求进行操作-可能是POST,因为GET将其所有变量信息打包到url中,并且具有长度限制在很多服务器上。客户端需要服务器的长响应-不要使用HEAD,因为根本不应该具有响应主体。


1
我从“如果您写的内容不符合协议,那么根本就不是协议”中闪过,回过头来告诉我他们有一个“家庭规则”,可以下棋而又不会cast叫或捕获过往的典当。我说过类似的话,“那是一个有趣的游戏,但没有这些规则就不是'棋子'。” 更改游戏规则,不再是同一游戏了。
Monty Harder

4
您写了一些关于没有方法或标头的情况将不是当前HTTP的圈子(而问题没有真正说明标头),但是您从未说过方法的用途以及没有方法的协议是否可以达到相同的目的—这就是问题所在。
aaa

1
为什么我需要说说这些方法是“针对”的?有一个规范文件。HTTP并不是什么神奇的东西,FTP或SMTP或RTMP也不是-它们都是沿着套接字的字节,但是字节所遵循的顺序,表示形式,规则(协议)使协议成为了协议。是。您已经阅读了我未回答的问题中的某些内容,但是我也不介意回答您的问题:没有方法也可以制定协议吗?-并非如此,但这取决于您对方法的含义。HTTP是使用HTTP方法的唯一协议,但我能想到的所有协议都有..
Caius Jard

..规定的交互模式,我称之为方法;没有它们,它们将不会成为协议,也将无法实现可靠的进程间/系统间通信。
Caius Jard

实际上,我说过有一个规范文档说明该方法的“目的”-不一定是正确的。这些方法不必“用于”任何东西;我们可以创建一个Web服务,以响应GET删除内容,并响应DELETE创建新用户。方法没有强制性行为,它们只是存在,因为已指定它们。系统是建立在协议之上的,因为它消除了一些艰苦的工作(我们不必发明协议也不需要使用它的系统),但是当我们控制双方时,协议的哪些方面被使用( ())是非常任意的
Caius Jard

12

HTTP可以看作是远程过程调用的一般原理的一种特定情况:您通过请求中的一些变量字段告诉服务器您想要什么,服务器将做出相应的响应。到目前为止,由于“ Web 2.0”的复杂交互性,这些相同的功能被推送到请求的每个字段中:URL,标头,正文-每个应用程序服务器和应用程序都以自己的方式理解它们。但是,最初的网络更简单,使用的是静态页面,并且人们认为HTTP方法提供了足够的交互性。值得注意的是,HTTP有很多很少使用的方法(如果有的话),其中有些方法由于使用了REST而只能得到启发。例如,在REST之前,PUT和DELETE就已rib一息,而TRACE和PATCH仍然是未知的。得出的结论是HTTP的RPC模型没有

REST提出了与您提出的建议完全相反的做法,他指出,如果将PUT和DELETE重新使用,HTTP方法将满足大多数应用程序的典型CRUD用例。

还要注意,HTTP方法具有分配给它们的语义,浏览器和中间件(例如代理服务器)会遵循它们的语义:POST,PUT,DELETE和PATCH请求可能会产生副作用,并且可能不是幂等的,因此客户端应用程序和中间件应格外小心在没有用户明确行动的情况下不触发这些请求。实际上,设计欠佳的Web应用程序确实使用GET进行了不安全的操作,例如Google Web Accelerator预取器通过删除此类网站上的大量数据而引起麻烦,因此其Beta版在启动后不久就被暂停。

因此,要回答“我们可以”这个问题:当然,您只需要同意一个协议即可告诉服务器应用您要执行的操作,然后将参数放在URL /正文中的某个位置即可,例如动作的目标项目。这组操作仅受特定应用程序的限制,因此您需要可扩展的协议。但是,您需要让客户端应用知道哪些请求是安全的,并且可能需要考虑其他细微差别,例如缓存控制。


4
“在REST之前,PUT和DELETE处于垂死状态”不正确。您认为WebDAV如何工作?
Patrick Mevzek

3
@PatrickMevzek是的,但是足够多的人使用WebDav认为他们活着而不是昏迷吗?^^
Frank Hopkins

1
@PatrickMevzek WebDAV实际上是与HTTP分离的协议。
duskwuff

@duskwuff tools.ietf.org/html/rfc4918 “用于Web分布式创作和版本控制(WebDAV)的HTTP扩展”。没有那么分开,它显然是最重要的。
Patrick Mevzek

1
REST使用PATCH来指示部分更改(也称为更新)。
jmoreno

7

从我个人作为开发人员的角度来看,它可以使创建API端点变得更加容易。例如,如果我编写一个控制器来管理网站上的产品,则可以使用相同的URL进行多种不同的操作。

例子:

GET https://example.com/api/products/1234

这将获取产品1234的详细信息。


POST https://example.com/api/products/1234

这将使用请求正文中的数据创建一个ID为1234的产品。


PUT https://example.com/api/products/1234

这将使用请求正文中的数据更新产品1234。


DELETE https://example.com/api/products/1234

这将删除ID为1234的产品。


我可以为每个操作设置不同的终结点,但这会使流程复杂化,并使其他开发人员难以理解。


1
这并不能像其他问题那样完全(或可能)回答确切的问题,但这是继续使用单个方法的现代理由。+1
TCooper19年

6

HTTP协议中的诸如GET和POST之类的方法有什么需求?

似乎您忘记了HTTP服务器仅用于提供文件的过去 ; 没有运行脚本,CGI或制作此类动态内容。

请求方法是基本规范的集合动词做什么与这些文件 ...

  • GET意味着下载
  • HEAD表示获取以下信息
  • PUT表示上传
  • 删除意味着删除
  • POST表示将数据发送到
  • 选项意味着告诉我我能做什么

在HTTP / 0.9的当天,请求线在该协议的请求腿唯一; 没有请求标头,没有响应标头。您只需键入GET /somefile,按Enter,服务器将返回响应正文(即HTML内容),然后再见,谢谢(即关闭连接)。

如果您只是想问为什么 设计这种方式?我的回答是因为它最初是为处理当时存在的内容交换而编写的,即应用户请求提供静态HTML文件。

但是,如果您想问一下如何在现代应用程序服务器中处理这些语义……

我们不能仅使用请求正文和响应正文来实现HTTP协议吗?

确实需要实现各种HTTP方法吗?

我的答案是:做任何您想做的事,但要记住,您不应违背协议期望的方式实现应用程序逻辑:GET之类的期望不应更改数据(或非常宽松,至少具有幂等结果) ),HEAD应该具有与GET相同的结果,但没有响应主体,PUT应该使目标URI的内容可用(如果成功)。

如果您在没有仔细考虑其含义的情况下违背期望,则会发生各种不愉快的事情,例如...

  • 当您在数据提交中使用GET方法时,服务器可能会在脸上吐出414个“ URI Too Long ”错误。
  • 当您将GET方法应用于数据修改时,您会发现,当用户位于高速缓存代理后面时,修改有时无法通过,或者当用户从书签中调出URL时(或Web爬网程序到达它时),将会发生意外的修改。 。
  • 当您对HEAD方法的响应不正确时,您会发现您的自动站点检查工具(例如wget --spider)在您的站点上保释。
  • 当您在内容下载中使用POST方法时,您会发现添加书签,甚至在浏览器中输入URL都不起作用。
  • 还有很多...

初学者知道规则,但退伍军人知道例外。

无论如何,您可能最终会找到一些有效的借口来违反某些狭use用例的某些规则。但请务必进行研究并考虑所有可能性。否则,您最终将无法实现互操作性,并破坏“用户体验”。

不能保证用户始终使用您测试过的主流知名品牌客户/用户代理的最新闪亮发布。他们可以使用根据自己的需求量身定制的本地品牌(包括我在内),从隔壁的专卖店订购的定制品牌,或从储藏室中挖出来的老式品牌。即使有所有这些,您的站点仍有望提供合理的服务。这就是我们拥有标准的原因。

粗心地违反标准也意味着您在歧视用户。


3

从理论上讲,我们可以在所有地方使用get,这确实可以完成工作。某些软件甚至在请求正文中使用GET(我正在查看您的elasticsearch / kibana)。这当然是一件可怕的事情。

最重要的原因是因为不同的方法具有不同的语义。有些是安全的,有些是幂等的。有些都是。看看哪个

这很重要,例如在与其他应用程序交互时。GET端点不应该有副作用。当Google爬到您的身边时,这一点很重要。PUT被认为是幂等的,这意味着如果发生故障,客户端可以自由地重试。POST并非如此,如果您在发布请求中按f5键,为什么浏览器必须有一个难看的确认框。

看看如果您使用GET应该在POST中使用会发生什么


1
身体的GET确实符合规范。
TRiG

有趣。好像它在2014
。– Esben Skov Pedersen

1
身体的GET不符合要求,只是不再专门违反它。现在未定义,这就是为什么某些客户端不支持它的原因。我相信cURL是一个例子
火星,

2

您也可以将GET,POST等视为同一函数的重载,甚至视为getter和setter。

GET_MyVar() 将不接受输入参数(也称为请求正文),但返回某些内容。

POST_MyVar(string blah)使用输入(同样是请求主体)执行某些操作,并且可能返回某些内容。(它还至少需要返回一个响应代码,以便我们知道该函数已运行!)

DELETE_MyVar() 也可能什么也不做,应该删除一些东西。

是的,我们可以通过以下方式实现所有功能:
MyVar(string Action, string? blah)

这样,我们可以只接受一个呼叫,然后根据其他参数选择要执行的操作。

但是这种方法的便利之一是它允许浏览器和服务器优化这些方法的工作方式。例如,也许服务器希望在阻止所有请求Action==DELETE。也许浏览器希望将内容缓存在Action==GET.不存在的地方,在每个函数中我们都必须编写if (Action==Delete) {return AngryFace}

不需要完全按照协议来实现所有内容,但是协议基本上是我们都决定遵循的一组规则。这样,即使我没有看到服务器,我也可以轻松猜出您的网站将要做什么!


1

HTTP方法有不同的用途。通常,GET用于下载和POST上传。

仅使用请求正文和响应正文来实现HTTP协议的一部分的唯一方法是实现POSTGET没有请求正文。它仅具有带标头的请求本身,而没有正文。这只是下载文档的请求。 POST同时具有请求正文(文件上传)和响应正文(显示结果的文档)。

那么,您可以实施POST并完成吗?如果您希望自己的网站在标准浏览器中可用,则不可以。浏览器发送的默认请求类型为GETPOST通常仅在提交网页中的表单或进行AJAX调用时才发送请求。仅当该特定服务器仅用于AJAX调用,而不用于用户可见的页面时,您才可能POST只能摆脱这种情况。

浏览器有时还会发送HEAD请求,以检查自上次下载以来是否已更改文档,因此建议也至少实施该更改。

无论如何,没有充分的理由从头开始为您的站点实现Web服务器。HTTP协议很复杂。除了各种方法之外,您还必须实现流水线和分块请求。在像Apache,Nginx或IIS这样的为您处理HTTP协议的Web服务器之上构建Web应用程序要容易得多。您提到了Servlet,因此也许应该使用运行Servlet的Tomcat或JBoss Web服务器。


我认为这个问题比A网站更重要。不是“为什么我必须实现GET和POST”,而是“为什么浏览器必须实现GET和POST”?
火星

@Mars如果是这种情况,则此问题不是本网站的主题。
斯蒂芬·奥斯特米勒

我想这是一个历史问题,似乎属于影响整个网站的问题(来自“询问问题”页面)。但是OP消失了,所以我想那将永远是一个谜
Mars

0

没错,我们可以做到这一点,如果我可以用POST方法取代HTTP,而其他方法则不能取代HTTP,那么GET,POST,PUT等只是历史惯例,尽管我不得不承认消除GET是一项艰巨的任务,那不可能完成,那匹马已经拴在那一个上了


1
“ GET,POST,PUT等只是历史惯例” –它们不是惯例。它们具有精确指定的行为,此外,它们具有精确指定的不同行为。
约尔格W¯¯米塔格

作为Web API开发人员,我可以轻松地将GET与POST互换,反之亦然,这就是我回答的基础,说实话POST可以解决的问题更少,如果我有自己的方式,请让我将所有API方法都设为POST方法
user104723 '19

-1

您提议的协议对黑客的安全性将大大降低。

有一个原因使网站远离在URL中存储有关变量等信息的原因,这很简单:它为攻击者提供了一种非常简单的攻击系统的方法。通过观察纯文本URL信息,他们可以确定构造为发送到Web服务器的数据的方式。然后,他们可以使用此信息通过使用特殊构造的URL对您的服务器执行攻击,该URL允许他们将恶意代码或数据注入您的服务器。


除了在HTTPS下,GET的内容在网络上根本不是纯文本的……而且攻击者可以通过运气,蛮力或其他技术来注入恶意代码,他们无需查看已发生的事情。
Patrick Mevzek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.