HTTP详解(二):HTTP报文格式

时间:2024-05-22 09:07:18

HTTP详解(二):HTTP报文格式

HTTP报文格式
HTTP详解(二):HTTP报文格式
上一篇文章呢,主要是说了一下HTTP、TCP/IP和SOCKET的一些区别和联系,今天呢主要是和大家聊一聊HTTP报文的格式问题。HTTP报文这一块,需要了解的点比较多,面试考察的点也很多,东西也很刁,所以需要花那么点时间去理解。废话不多说,咱们开始吧。
HTTP有两种报文格式:
请求报文:由客户端向服务器端发出的报文。
响应报文:从服务端到客户端的报文。
我们呢,一个一个来说一下,先说请求报文。先看一下大学期间比较熟悉的一张图
HTTP详解(二):HTTP报文格式
请求报文:
我们先从最右边开始看,可以看出来,HTTTP请求报文由三部分构成,分别是:请求行、请求头、请求实体。当然,严格意义上来说,应该还包括空行。

请求行:
首先,为什么要用请求行?
其实,请求航的存在其主要目的就是为了区分报文是请求报文还是响应报文,以及记录相应的URL以及协议版本。可以看出,请求行主要由三部分构成:方法、请求资源的URL、HTTP的版本。其中URL和版本无须多说,咱们主要说一下“方法”;
HTTP请求的方法主要有:GET、POST、PUT、DELETE、OPTIONS、HEAD、TRANCE、CONNECT等
其中,最常用的是GET和POST请求,但是我们都来了解一下。
GET:想特定的资源发出请求。
POST:向指定的资源提交相应的数据金星焕处理请求,比如说提交表单、上传文件。数据被包含在请求实体中。
PUT:从客户端向服务器传送的数据取代指定的文档的内容。
DELETE:请求服务器删除指定的页面
OPTIONS:允许客户端查看服务器的性能。
HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
TRANS:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
我们重点来说一下GET和POST方法。
1、GET请求,请求的数据会附在URL后面,已key=value(参数名=参数值)的形式传递,具体例子:http://localhost:8888/abc/login.jsp?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD,在这里有一点十分的重要:GET请求中的参数用“?”分割URL实体和传递参数,而参数之间用“&”进行分割。其中,如果传输的数据是英文字母或者数据,则原样发送;如果时空格,转换成“+”;如果是中文或者其他的字符,则直接把传输的数用BASE64加密,转换成十六进制输出,比如后面的%E4%BD%A0%E5%A5%BD就是16进制的输出。
POST请求,则是把提交的数据放在HTTP请求实体中。
2、GET请求最大长度是有限制的,可能有一种说法是GET请求传递参数的最大长度是1024KB,其实这种说法是不准确的。实际中,URL并不存在参数上限的限制,HTTP规范里面也并没有对URL的长度进行限制。而这个限制主要是来自浏览器和服务器。比如IE6.0浏览器所支持的最大长度的URL长度是2083KB,firefox 3.0.3浏览器所支持的最大长度是7764KB.
POST请求传递的数据是没有大小限制的,HTTP规范中也没有对其进行相应的限制。只不过是处理器的处理能力限制了它。
一般来说,GET请求传递的数据大小要小于POST传递数据的大小。
3、POST的安全性要比GET请求的安全性要高一些。因为GET请求传递的参数是后缀在URL后面的,可以直接看到,所以安全性较POST请求安全性会差一些!
我们来看一下具体请求报文示例:
其中第一行就是请求行,上图中“GET”代表着请求的方法为GET请求,HTTP/1.1 代表这使用的HTTP协议的版本,中间代表着URL。

请求头:
1、请求头的作用:请求头是用来通知服务器有关客户端请求的一些信息。
2:请求头的格式:请求头由关键字/值对构成,每行一对。关键字和值用英文冒号“:”隔开,值对之间用英文逗号","隔开。
比如上图中:Accept、Host、User-Agent等等都是请求头中关键字。
我们来了解几个比较重要的请求头中属性,后期我们会有专门的一篇文章去介绍HTTP 报文的头部。
Accept:指定客户端能够接收的内容类型 示例:Accept: text/plain, text/html
Cookie:HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 示例:Cookie: $Version=1; Skin=new;
Content-Type:显示HTTP提交的内容类型,一般来说POST请求会设置这个属性 示例:Content-Type: application/x-www-form-urlencoded
请求实体:
请求实体作用:用来传输具体数据报文
请求头和请求正文之间会有一个空行,这个空行非常的重要,主要是用来告诉服务器端请求头已经结束了,接下来的是请求正文啦!具体见下图。
上图中的“txtName=123&txtPwd=123”就是具体的请求报文。

响应报文:
严格意义上将,响应报文由四部分构成:状态行、响应头、空行、响应正文构成。
其中状态行由3部分构成,分别是协议版本、状态码、状态描述,之间由空格构成。
对于,我们开发人员来说,状态行中可能最重要的就是状态码,不同状态码能表示出此次请求的状态。
状态码由三位数字组成,其中200~299代表着成功,300~399代表着资源重定向,400~499代表客户端请求错误,500~599表示服务器端出错。
其中呢,有几个状态码是比较常见,比较重要的,上图!
HTTP详解(二):HTTP报文格式
响应头部:
与请求头部是类似的,它是用来告诉客户端响应报文的一些相关信息的。前面我们已经大致的讲述了请求头,响应头部我们就直接上图吧。
响应头 说明
Server 服务器应用程序软件的名称和版本
Content-Type 响应正文的类型(是图片还是二进制字符串)
Content-Length 响应正文长度
Content-Charset 响应正文使用的编码
Content-Encoding 响应正文使用的数据压缩格式
Content-Language 响应正文使用的语言
响应正文:
用来传输响应数据,跟请求实体是类似的,在这里就不赘述了。