GET和POST协议详解

Posted wbyp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GET和POST协议详解相关的知识,希望对你有一定的参考价值。

一、GET请求报文分析:

技术分享图片

1、 请求行

  a) GET(描述该请求采用了什么请求方法),HTTP协议中包含8种请求方法:

    • GET     请求获取Request-URI 所标识的资源
    • POST    在Request-URI 所标识的资源后附加新的数据
    • HEAD    请求获取由Request-URI 所标识的资源的响应消息报头
    • PUT     请求服务器存储一个资源,并用Request-URI 作为其标识
    • DELETE  请求服务器删除Request-URI 所标识的资源
    • TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
    • CONNECT 保留将来使用
    • OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

  b) URI(请求WEB服务器的资源名称)

    (一) URI:统一资源标识符(代表这个资源的名称),如:上图中的 /PrjTheHttpProtocol/test?username=admin&userpassword=123

    说明:HTTP协议规定GET请求发送数据在URI中发送,格式:uri?name=value&name=value&name=value…..

    (二) URL:统一资源定位符(不但代表这个资源的名称,而且通过它还可以找到该资源),如:http://ip:port/URI

  c) HTTP1.1(当前使用的HTTP协议版本)

2、请求报头

  a) 告诉web服务器浏览器接收的语言版本

  b) 请求web服务器的IP地址和端口号

  c) Cookies等信息

3、空白行(分割请求报头和请求体的专用行)

4、请求体(由于当前使用的请求方式是GET请求方式,所以请求体中不传送任何数据)

二、POST请求报文分析:

技术分享图片

1、 请求行

  a) 上图采用POST方式发送请求。

  b) 上图URI后边没有任何数据,这是因为采用POST方式提交的缘故。

  c) HTTP1.1(当前使用的HTTP协议版本)

2、 请求报头(由于请求是POST请求,所以报头中显示:Cache-Control:no-cache

3、 空白行(分割请求报头和请求体的专用行)

4、 请求体(由于当前使用的请求方式是POST请求方式,所以数据在请求体中发送,并且格式是:name=value&name=value&name=value……

三、响应报文分析:

技术分享图片

1、 状态行

  a) HTTP1.1  : HTTP协议版本号

  b) 200  : 响应状态号

    状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

        1xx:指示信息--表示请求已接收,继续处理

        2xx:成功--表示请求已被成功接收、理解、接受

        3xx:重定向--要完成请求必须进行更进一步的操作

        4xx:客户端错误--请求有语法错误或请求无法实现

        5xx:服务器端错误--服务器未能实现合法的请求

    常见状态代码、状态描述、说明:

        200  OK      客户端请求成功

        400  Bad Request  客户端请求有语法错误,不能被服务器所理解

        401  Unauthorized  请求未经授权

        403  Forbidden  服务器收到请求,但是拒绝提供服务

        404  Not Found  请求资源不存在

        405  浏览器客户端发送的请求和底层的方法doPost/doGet不一致导致的。

        500  Internal Server Error  服务器发生不可预期的错误

        503  Server Unavailable    服务器当前不能处理客户端的请求,一段时间后, 可能恢复正常。

  c) OK  : 对响应结果的描述

2、 响应报头

  a) WEB服务器版本信息

  b) 内容类型以及字符编码方式

  c) 内容长度,响应回来的总字符数

  d) 响应时间

  e) Cookies等信息

3、 空白行(分割响应报头和响应体的专用行)

4、 响应体:响应正文(从WEB服务器端响应回来的html代码)

四、HTTP请求中GET和POST的区别

HTTP请求的两种方式,GET和POST请求的表形式上的区别:

  1. GET请求通过URL(请求行)提交数据,在URL中可以看到所传参数。POST通过“请求体”传递数据,参数不会在URL中显示 。
  2. GET请求提交的数据有长度限制(1024或2048),POST请求没有限制(或限制80KB)。
  3. GET请求返回的内容可以被浏览器缓存起来。而每次提交的POST,浏览器在你按下F5的时候会跳出确认框,浏览器不会缓存POST请求返回的内容。

以上描述都是GET,POST两者区别表现形式,是浏览器对这两种请求的处理方式。

HTTP请求的两种方式,GET和POST请求的本质上的区别:

HTTP协议是这样解释GET和POST的:GET请求不应该做读取数据之外的事情。而如果一个请求,修改了服务器资源或者使用了服务器资源(如发邮件,使用打印机等),那么应当使用POST。所以,GET和POST的本质区别是使用场景的区别,简单的说,GET是只读,POST是写。浏览器对两种请求的不同处理方式也是基于这两个不同的场景:

  1. GET:查询往往需要的上传的数据量比较小,查询参数也往往不需要保密,所以放在URL里比较高效。HTTP协议要求同一URL的多个请求应该返回同样的结果,所以浏览器可以把返回结果缓存起来,以提高性能。至于参数长度的限制,这个是和浏览器URL的长度限制相关的,1024也好,2048也好,其实没有太大的意义,参数超长往往是错误使用GET方法的结果。
  2. POST:修改数据需要支持大数据量表单的提交,数据也常常包含用户的私人信息,所以数据放在请求的消息体中传递。相同的POST请求可能会对服务器端产生不同的影响,比如两次POST可能创建两条不同的数据,所以对POST返回结果的缓存是没有意义的。

用GET,还是用POST?

如果回答“因为POST的参数长度不受限制,所以我用POST,就有点本末倒置了。两者之间如何选择,首先要看是不是修改或者使用了服务器资源,其次要看请求或者响应中的数据是不是包含了敏感信息,如果是,那么应该选择POST,同时处于安全性的考虑,服务器端应该只接受POST,拒绝GET。比如数据的增加和修改,认证信息的提交,是一定要用POST的。如果只是简单查询,用GET就可以了。

POST请求是不是比GET请求更安全?

有人说“POST比GET安全,因为GET的参数都明文写在URL上了”,从个人信息安全的角度上说,这句话是对的,但这种安全机制是“防君子不防小人”的,有各种工具能够获取POST请求的数据。如前面所说,两者有截然不同的使用场景,如果是该用POST的地方用了GET,又说GET不安全,那GET也太冤枉了。其实,HTTP协议中提到GET是安全的方法(safe method),其意思是说GET方法不会改变服务器端数据,所以不会产生副作用。这是建立在Web开发人员正确使用GET方法的基础上的,如果修改数据的请求却使用了GET方法,显然是非常危险的。

GET与POST的误用有什么危害?

应该使用GET的地方用了POST:性能受损,浏览器不会缓存。

应该使用POST的地方用了GET:每一个这样的地方都是一个漏洞,有可能被黑客利用。如果是一个对安全要求很高的网站,一定不要忽视。

不仅仅是在前端要正确的使用GET和POST,同时还需要后端代码的支持,比如后端应当在需要POST请求的时候拒绝GET请求,从而切断黑客利用GET请求攻击的途径,更高级别的,还需要对POST请求进行过滤,以确保所有的POST请求都来自可信任的地址。

如何判断当前请求是GET请求还是POST请求?

  • 在浏览器地址栏上直接编写URL提交的请求一定是GET请求。
  • 使用热链接向服务器发送的请求一定是GET请求。
  • 使用form表单提交数据的时候,如果method属性没有编写,或者method属性值被指定是GET,这样发送的请求属于GET请求。
  • 使用form表单提交数据的时候,如果method属性值被手动指定为POST,那么该请求属于POST请求。

以上是关于GET和POST协议详解的主要内容,如果未能解决你的问题,请参考以下文章

HTTP协议的详解

HTTP协议详解

基础篇-http协议《http 简介url详解request》

HTTP协议详解

计算机网络HTTP协议详解

HttpClient使用详解与实战一:普通的GET和POST请求