据我所知,它们可以分为三类:
- 永远不要使用
GET
,而是使用POST
- 永远不要使用
POST
,而是使用GET
- 你使用哪种方法都可以。
我是否正确地假设了这三种情况?如果是这样,每种情况有哪些例子?
据我所知,它们可以分为三类:
GET
,而是使用 POST
POST
,而是使用 GET
我是否正确地假设了这三种情况?如果是这样,每种情况有哪些例子?
对于创建(我知道这很讽刺)、编辑和删除等破坏性操作,请使用POST
,因为您无法在浏览器地址栏中调用POST
操作。当允许用户调用操作时,请使用GET
。因此,URL可能如下:
http://myblog.org/admin/posts/delete/357
应该将您带到确认页面,而不仅仅是删除该项。这样更容易避免意外情况。
POST
比 GET
更安全,因为您不必将信息放入 URL 中。因此,在收集密码或其他敏感信息的 HTML 表单中使用 GET
作为 method
不是最好的选择。
最后注意一点: POST
可以传输比 GET
更多的信息。 'POST' 对于传输的数据没有大小限制,而 'GET' 的限制为2048个字符。
简述
安全且幂等
idempotent
的请求,请使用GET
既不安全也不幂等
的请求,请使用POST
详细说明 每个操作都有适当的位置。即使您不遵循RESTful原则,学习REST和资源导向方法的工作原理也可以获得很多收益。
RESTful应用程序将使用GET来进行既安全又幂等的操作。
一个安全
的操作是一个不改变请求数据的操作。
一个幂等
的操作是无论请求多少次结果都是相同的操作。
由于GET用于安全操作,因此它们也自动成为幂等操作。通常,GET用于检索资源(例如stackoverflow上的问题及其相关答案)或资源集合。
RESTful应用程序将使用PUT来进行既不安全但幂等的操作。
我知道这个问题是关于GET和POST的,但我会在一秒钟内回到POST。
通常,PUT用于编辑资源(例如stackoverflow上的问题或答案编辑)。
POST
将用于任何既不安全也不幂等的操作。
通常情况下,POST用于创建新的资源,例如创建一个新的SO问题(尽管在某些设计中也可以使用PUT)。
如果你运行POST两次,你就会创建两个新问题。
还有一个DELETE操作,但我想我可以把它留在那里:)
讨论
实际上,现代Web浏览器通常只可靠支持GET和POST(您可以通过javascript调用执行所有这些操作,但在填写表单并按提交按钮方面,您通常只有两个选项)。在RESTful应用程序中,POST通常会被覆盖以提供PUT和DELETE调用。
但是,即使您不遵循RESTful原则,考虑使用GET检索/查看信息和POST创建/编辑信息也可能很有用。
您永远不应该使用GET来更改数据。如果搜索引擎爬取到您的恶意操作链接,或者客户端将其加为书签,可能会带来大麻烦。
如果您不介意请求被重复发送(即不改变状态),请使用GET。
如果操作会改变系统的状态,请使用POST。
GET:通常用于提交搜索请求或需要用户能够再次精确调取页面的任何请求。
GET 的优点:
GET 的缺点:
POST:用于更高安全级别的请求,其中数据可能用于更改数据库,或者您不希望某人加为书签的页面。
POST 的优点:
POST 的缺点:
直接引用超文本传输协议 - HTTP/1.1:
9.3 GET
GET 方法表示检索由 Request-URI 标识的任何信息 (以实体形式)。如果 Request-URI 引用数据生成进程,则将作为响应中的实体返回所生成的数据,而不是该进程的源文本,除非该文本恰好是该进程的输出。
如果请求消息包含If-Modified-Since、If-Unmodified-Since、If-Match、If-None-Match或If-Range报头字段,则GET方法的语义将更改为“条件GET”。条件GET方法要求只在符合条件的情况下传输实体,这些条件由条件报头字段描述。条件GET方法旨在通过允许刷新缓存实体而无需多次请求或传输客户端已经持有的数据来减少不必要的网络使用。
如果请求消息包括一个Range报头字段,则GET方法的语义将更改为“部分GET”。部分GET请求只传输实体的部分内容,如第14.35节所述。部分GET方法旨在通过允许完成部分检索的实体而无需传输客户端已经持有的数据来减少不必要的网络使用。
仅当响应满足第13节中描述的HTTP缓存要求时,GET请求的响应才可缓存。
有关表单使用时的安全注意事项,请参见第15.1.3节。
POST方法用于请求源服务器将请求中封闭的实体作为与Request-Line中标识的资源的新下属接受。POST被设计为允许一个统一的方法来覆盖以下功能:
- 注释现有资源; - 将消息发布到公告板、新闻组、邮件列表或类似的文章组; - 提供一块数据,例如提交表单的结果,以供数据处理过程使用; - 通过追加操作扩展数据库。
POST方法实际执行的功能由服务器确定,通常取决于Request-URI。提交的实体与该URI相对应,就像文件与包含它的目录相对应,新闻文章与其所属的新闻组相对应一样。发布(POST)方法是HTTP协议的一种方法,用于将实体提交到指定的资源,例如将新文章提交到新闻组或将记录提交到数据库的下级。
通过“POST”方法执行的操作可能不会产生可以由URI标识的资源。在这种情况下,根据响应是否包含描述结果的实体,200(OK)或204(无内容)是适当的响应状态。
首要重要的是GET和POST的含义区别:
此外,可以注意以下几点:
无论如何,我认为没有 GET 我们就无法 "生存":想想您每天使用多少带有查询字符串参数的 URL —— 没有 GET,所有这些都不会工作 ;-)
http://example.com/var1/value1/var2/value2/var3/value3
,我们在技术上就可以不再使用GET了... - Tyler Carterwww.mypage.com/contact/
,内部也会使用GET方法来处理类似于index.php?url=/contact/
的内容。 - Thiago Belem除了在许多Web浏览器中存在的长度限制差异外,还存在语义差异。GET应该是“安全”的,因为它们是只读操作,不会更改服务器状态。POST通常会更改状态,并且会在重新提交时发出警告。搜索引擎的网络爬虫可能会进行GET,但不应进行POST。
如果您想读取数据而不更改状态,请使用GET;如果您想在服务器上更新状态,请使用POST。
一个实际的区别是,浏览器和web服务器对URL中存在的字符数量有限制。具体的限制因应用程序而异,但如果表单中有标签,则很可能会超出限制。
另一个需要注意的问题是GET请求会被搜索引擎和其他自动化系统索引。谷歌曾经推出一款产品,可以预取你正在浏览的页面上的链接,以便在你点击这些链接时更快地加载。这给那些链接带有delete.php?id=1
这样的网站造成了严重的破坏 - 用户失去了整个网站。
GET
请求是用来获取信息的。POST
请求是用来执行操作的。同一个URL可能会响应POST和GET请求,并根据请求的不同而执行不同的操作。Google只会索引它遇到的GET URL。如果在/qpoiweurpiowqueproiuwer.html
上有一个GET URL,但没有任何链接指向它,Google也不会知道它的存在。 - ceejayoz我的一般准则是在向服务器发送不会更改状态的请求时使用 Get。而当需要向服务器发送更改状态的请求时,则应该使用 Post。
当您希望URL反映页面状态时,请使用GET。这对于查看动态生成的页面非常有用,例如在此处看到的那些页面。在表单中提交数据时应使用POST,例如当我点击“发布您的答案”按钮时。它还会生成一个更干净的URL,因为它不会在路径之后生成参数字符串。
1.3 选择 HTTP GET
或 POST
的快速检查清单
The interaction is more like a question (i.e., it is a safe operation such as a query, read operation, or lookup).
The interaction is more like an order, or
The interaction changes the state of the resource in a way that the user would perceive (e.g., a subscription to a service), or
The user be held accountable for the results of the interaction.