据我所知,GET可以做什么,POST也可以实现。那么为什么在定义HTTP协议时首先需要GET。如果GET仅用于获取资源,则人们仍然可以通过在URL中发送参数值来更新资源。为什么这个漏洞?或者在服务器端进行编码以在GET请求上更新资源的人编写了错误的代码?
答案 0 :(得分:13)
HTTP specified different methods for different purposes. GET method旨在用于“检索由Request-URI标识的任何信息(以实体的形式)”。特别是,它旨在成为safe and idempotent method。这意味着GET请求不应有副作用(即更改数据):
特别是,已经建立了一个惯例,即GET和HEAD方法不应该具有采取除检索之外的动作的重要性。
多次发送相同的请求与仅发送一次相同:
方法也可以具有“幂等性”的特性(除了错误或期满问题之外)N的副作用> 0个相同的请求与单个请求相同。方法GET,HEAD,PUT和DELETE共享此属性。
答案 1 :(得分:8)
实际上,没有浏览器通过单击链接实现POSTing(不拦截JavaScript中的click事件),也不为POST数据添加书签。此外,语义上POST和GET用于不同的目的。一种是将数据发布到应用程序,另一种是从应用程序中获取数据。这些语义具有实际意义,但它们也具有与应用程序设计质量相关的理论设计含义:不能与POST处理GET的应用程序可能存在大量安全问题和工作流程错误。
答案 2 :(得分:3)
无论何时进行网络搜索,并希望将某人链接到网络搜索,您都可以通过以下方式轻松完成:
http://www.google.com/search?q=lol
你能想象告诉别人做一个POST请求吗? POST请求实际上并不像这样可收藏,这就是GET很有用的原因。
他们只是有不同的目的,如其他答案中所述。 GET用于GETing,POST用于POST。
答案 3 :(得分:3)
来自RFC 2616:
9.3 GET
GET方法意味着检索任何东西 信息(以实体的形式) 由Request-URI标识。如果 Request-URI是指a 数据生成过程,它是 产生的数据应归还 作为响应中的实体而不是 除非过程的源文本 该文本恰好是输出 这个过程。
GET方法的语义发生了变化 如果请求,则为“条件GET” 消息包括If-Modified-Since, If-Unmodified-Since,If-Match, If-None-Match或If-Range标头 领域。条件GET方法 请求该实体 只转移了 情况描述的 条件标题字段。该 有条件的GET方法是为了 减少不必要的网络使用量 允许缓存的实体 刷新而不需要多个 已经请求或传输数据 由客户持有。
GET方法的语义发生了变化 如果请求,则为“部分GET” 消息包括Range头字段。 部分GET请求只是部分 被转让的实体,如 在第14.35节中描述。该 部分GET方法旨在 减少不必要的网络使用量 允许部分检索的实体 完成而不转移 已经由客户持有的数据。
对GET请求的响应是 当且仅当它符合时才可缓存 HTTP缓存的要求 在第13节中描述。
有关安全性,请参阅第15.1.3节 用于表格的注意事项。
9.5 POST
POST方法用于请求 原始服务器接受 请求中包含的实体作为 新的资源下属 由Request中的URI标识 请求线。 POST旨在 允许统一的方法来覆盖 以下功能:
- Annotation of existing resources; - Posting a message to a bulletin board, newsgroup, mailing
列表中, 或类似的一组文章; - 提供一个数据块,例如提交的结果 形式,数据处理过程; - 通过追加操作扩展数据库。实际上 POST方法执行的功能 由服务器确定并且是 通常依赖于Request-URI。 已发布的实体从属于 该URI与文件的方式相同 从属于目录 包含它,新闻文章是 从属于它的新闻组 已过帐,或记录是从属的 到数据库。
POST执行的操作 方法可能不会导致资源 可以通过URI识别。在 这种情况下,200(OK)或204(No. 内容)是适当的回应 状态,取决于是否 响应包括一个实体 描述结果。
如果已在该资源上创建了资源 原始服务器,响应应该是 201(已创建)并包含实体 它描述了。的状态 请求并指新的 资源和位置标题(请参阅 第14.30节。
对此方法的回应不是 可缓存,除非响应 包括适当的Cache-Control或 过期标题字段。然而 可以使用303(参见其他)响应 指示用户代理检索 可缓存的资源。
POST请求必须遵守该消息 传输要求载于 第8.2节。
有关安全性,请参阅第15.1.3节 考虑。
如上所述,如果请求消息具有基于某些标准的条件,则响应可以随GET而改变。 POST要求服务器接受请求,无论如何。
答案 4 :(得分:2)
使用原始TCP连接也可以实现一切。然而,我们经常使用HTTP而不是原始TCP连接,因为HTTP提供了一层抽象,因此提供了方便和符合要求的实现。同样,我们正确地使用HTTP(GET,POST,PUT,DELETE等)而不是愚蠢(仅限POST),因为这些动词提供了额外的抽象层,因此,方便和符合实现。
答案 5 :(得分:1)
假设我想通过链接向页面发送变量,我可以使用POST吗?不,但是通过GET,我可以通过?variableName=someValue
答案 6 :(得分:1)
你是对的,一切都可以通过HTTP POST进行隧道传输。实际上,SOAP Web服务就是这样做的。一切都是使用SOAP Web服务的POST。
在这种情况下,您正在通过HTTP进行隧道传输,而不是最充分地使用HTTP。如果这就是你想做的一切,那就没关系了。
但是,如果您希望利用HTTP提供除简单邮件传输之外的功能和优势,那么您应该阅读RFC并了解其余的HTTP协议,包括GET,PUT,POST,DELETE和所有标题,缓存管理和结果代码。