zoukankan      html  css  js  c++  java
  • HTTP请求中POST与GET的区别

    一、原理区别

    一般我们在浏览器输入一个网址访问网站都是GET请求;在FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式。

    HTTP定义了与服务器交互的不同方法,其中最基本的几种:GET,POST,PUT,DELETE,HEAD,其中GET和HEAD被称为安全方法,因为使用GET和HEAD的HTTP请求不会产生什么动作。不会产生动作意味着GET和HEAD的HTTP请求不会在服务器上产生任何结果。但是安全方法并不是什么动作都不产生,这里的安全方法仅仅指不会修改信息。

    根据HTTP规范,POST可能会修改服务器上的资源的请求。比如CSDN的博客,用户提交一篇文章或者一个读者提交评论是通过POST请求来实现的,因为再提交文章或者评论提交后资源(即某个页面)不同了,或者说资源被修改了,这些便是“不安全方法”。

    二、表现形式区别

    <method> <request-URL> <version>
    <headers>
    <entity-body>

    HTTP请求中,奇异行必须是一个请求行,包括请求方法,请求URL,报文所用HTTP版本信息。紧接着是一个herders小节,可以有零个或一个首部,用来说明服务器要使用的附加信息。在首部之后就是一个空行,最后就是报文实体的主体部分,包含一个由任意数据组成的数据块。但是并不是所有的报文都包含实体的主体部分。

    GET请求实例:

       GET http://weibo.com/signup/signup.php?inviteCode=2388493434

       Host: weibo.com

      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

    POST请求实例: 

      POST /inventory-check.cgi HTTP/1.1

      Host: www.joes-hardware.com

      Content-Type: text/plain

      Content-length: 18

      item=bandsaw 2647

    接下来看看两种请求方式的区别:

    1.post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志以及浏览器浏览记录中)
    2.post发送的数据量更大(在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。一般不超过2kb。因此,在使用GET请求时,传输数据会受到URL长度的限制。对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。Tomcat的上限是2M)

    3.post能发送更多的数据类型(get只能发送ASCII字符)
    4.post比get慢,get产生一个tcp数据包,而post产生两个tcp数据包。
    5.get是幂等的,而post不是幂等的(一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同,get是安全方法,不会修改服务器端信息,而post会修改服务器端的资源)
    6.get可以被缓存,post不可以被缓存


    PS:get和post相比,要快,是因为get和post的请求过程不同,不过前三步都是一样的,都是要先经过和服务器的三次握手:
    1.浏览器请求tcp连接(第一次握手)
    2.服务器答应进行tcp连接(第二次握手)
    3.浏览器确认,并发送请求头和数据
    4、服务端响应,GET请求产生了一个TCP数据包,而POST请求产生了两个TCP数据包。因为get请求数据小,浏览器会将head和data一起发送出去,服务器响应200 ok,返回数据。而对于post请求,浏览器会先发送head,服务器响应100 continue,浏览器在发送data,服务器响应200 ok,返回数据。

  • 相关阅读:
    oracle的常见问题与解决
    final、finally、finalize的区别
    java中读取程序运行时间
    数据库设计与SQL优化的建议
    Eclipse 快捷键操作和常用设置
    OO设计原则
    structs常用的Action
    java的深复制与浅复制
    python进制(十进制,八进制,十六进制)
    linux的shell基础
  • 原文地址:https://www.cnblogs.com/manshufeier/p/9352954.html
Copyright © 2011-2022 走看看