Web 开发中两个最容易被误解的术语 GET 和 POST
如果您做过任何类型的 Web 开发,那么您一定遇到过GET和POST这两个术语。这些术语是针对表单标签引入的。解释是这样的:
“In the form tag, there is an attribute called method. There you can specify in which way you want to send data to the backend. There are two values present for this attribute which are GET & POST.”
GET:如果您使用此方法,那么您在表单中写入的数据将附加到 URL 并被发送。由于用户输入在 URL 中清晰可见,因此此方法不安全,并且您可以发送的内容和发送的数量存在限制。
POST:如果您使用 POST,那么数据将在 HTTP 请求正文中发送。它不会在 URL 中显示。您可以发送多少数据没有限制。 POST 还支持发送任何类型的数据。
我到处都观察到,这就是将 GET 和 POST 介绍给学生的方式。虽然这么多的解释足以让一个人在表单的上下文中使用 GET 和 POST,但它们并没有清楚地理解这两种方法。
下面是一个例子的解释。我们将使用PHP代码作为示例。 (我们已经使用$_REQUEST来捕获数据,以便可以将同一个文件用于两者)。
句法:
GET:这里是 GET 表单的代码。
输出
正如预期的那样,参数的值出现在 URL 中。但是,如果我们使用 chrome 检查工具进行更多分析,我们可以看到“查询字符串参数”部分下存在的值。
POST:这是 POST 表单的代码。如果您注意到,除了方法属性的值之外,它与我们的 GET 表单相同。
输出:
数据已发送。但是现在如果我们使用 Chrome 工具检查它,参数会出现在“表单数据”部分下。 GET 和 POST 属于一个叫做 HTTP 方法的家族(属性方法的名称来自这里)。一些 HTTP 方法是GET 、 PUT 、 POST 、 DELETE 、 HEAD 、 PATCH 、 OPTIONS 、 TRACE等。
它们都为 HTTP 协议提供多种用途。我们将主要关注本文中的前四个。
CRUD 操作:如果您正在使用数据库,那么您一定遇到过这些术语。通俗地说,我可以将 CRUD 解释为必须通过 API 提供给最终用户才能正确使用任何数据库管理系统的基本功能(在您的 Web 开发环境中,它将是您与服务器一起使用的 DBMS代码,比如 MySql、Hibernate 等)。 CRUD 代表CREATE 、 READ 、 UPDATE和DELETE 。正如我前面提到的,四种 HTTP 方法对应于其中一种操作。
- CREATE: SQL 命令将用于在数据库中创建记录。此操作对应的 HTTP 方法是 POST,因为您将“POSTING”请求正文中的值添加到数据库中)。
INSERT INTO tablename VALUES (value1_for_column1, value2_for_column2, . . );
- READ:它用于读取数据库中已经存在的记录。可以使用 WHERE 子句专门询问他/她想要阅读的记录。 SQL 命令将是:
SELECT * from WHERE columnX = valueX AND columnY > valueY . . . ;
该操作对应的HTTP方法是GET。尝试将此与 GET 请求后生成的 URL 进行比较,即“?”之后的部分在 URL 中标记,在 WHERE 子句之后使用表达式。他们俩很相似,不是吗?
- UPDATE:这用于更新数据库中的记录。对应的 HTTP 方法是 PUT。在 SQL 中,我们可以通过 UPDATE 语句来实现。
- 删除:这有点不言自明。想删除一条记录。 HTTP 方法和 SQL 命令都将是 DELETE。
现在,如果您考虑一下我们之前的输出,那就更有意义了。对于GET ,请求正文为空,值位于查询字符串参数下。因为表单字段被视为向 URL “ localhost/target.”询问的查询的参数。 PHP ”。
在 POST 方法中,表单中输入的数据与请求正文一起出现。所以它出现在表单数据部分下。它被视为用户想要发送的一些数据,而不是查询的一些参数。
GET 和 POST:现在让我们回过头来思考一下 HTTP 协议的设计者。我们知道 GET 旨在用于用户请求记录列表的情况。用户进行搜索的字段通常非常小并且是文本。因此,对于 GET 请求,除了文本和超过 30kb 的内容外,不需要允许任何内容。相反,如果我们保持较小,则处理延迟将降低。
现在考虑到这些事情,试着想想你每天使用的一些应用程序,你认为这些应用程序正在使用 GET。是的!搜索引擎。现在打开一个搜索引擎尝试搜索一些东西。观察出现的 URL。
- 必应搜索:
- 谷歌搜索:
让我们再次考虑一下 HTTP 的开发人员。通过 POST,用户将创建需要传递大量数据的新记录。这么多数据无法通过 URL 传递,因此最好将它们作为 HTTP 数据包发送。此外,该记录可能包含一些个人数据,因此 POST 方法必须是安全的。因此,POST 与处理用户数据的表单一起使用(如 google 表单,当您在 GfG 上创建新帐户时)。
从现在开始,我谈到了创建帐户,您可能想知道,“登录呢?在那里,一个人不会创造任何新记录!那为什么那里不使用 GET 呢?”虽然人们可以简单地通过说 GET 不安全来抛弃这个问题,但我们不会将其用于登录。但是,让我们在我们目前讨论的背景下考虑它。登录时,您实际上并没有请求/搜索您的记录。让我们从搜索的角度考虑登录。然后您传递用户名和密码并询问系统是否存在具有这些凭据的任何帐户。那将是非常错误的,而是当我们登录时,我们请求系统允许我们与我们的数据进行交互。在银行类比中,登录将要求经理向我们提供将打开我们的储物柜的钥匙,而搜索将询问人 X 在这家银行是否有储物柜,这又是非常错误的,并且违背了隐私的整个目的。因此,如果您提供正确的签名,那么经理将为您提供打开储物柜的钥匙。在 Web 开发中,服务器会为您提供 sessionId。
让我们把它包起来。登录时,如果凭据正确,后端将为您创建一个会话并提供一个 sessionID。现在使用 sessionId 你可以搜索你的数据。因此,POST 适合这种情况。而且,一旦您登录,您就可以使用 GET 请求来检索您的数据。
结论:总而言之,GET 用于读取/访问某些资源,POST 用于创建它。我建议您不要限制自己在 DBMS 方面的思考资源,而是从更广泛的意义上考虑它。资源可以是任何东西,从数据库中的一行到图像或文本等文件,有时甚至是完整的 HTML 页面。如果要读取/搜索资源,请使用 GET;如果要创建/添加/上传资源,请使用 POST。