为什么我们需要HTTP GET?是否有任何HTTP POST无法实现的功能?

时间:2010-10-19 16:33:04

标签: http post get

据我所知,GET可以做什么,POST也可以实现。那么为什么在定义HTTP协议时首先需要GET。如果GET仅用于获取资源,则人们仍然可以通过在URL中发送参数值来更新资源。为什么这个漏洞?或者在服务器端进行编码以在GET请求上更新资源的人编写了错误的代码?

7 个答案:

答案 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和所有标题,缓存管理和结果代码。