HTTP报文是客户端和服务器相互通信时发送的数据块。
HTTP报文有两类。
(1)请求报文:从客户端向服务器发送请求的报文。
(2)响应报文:从服务器向客户端回答请求的报文。
下面通过图1-5来了解客户端和服务器在相互通信时对HTTP报文的处理过程。
图1-5 HTTP请求/响应报文
首先客户端向服务器发送 HTTP 请求报文,请求报文(第一部分)的第一行说明了请求方式(GET)、使用的通信协议(HTTP)和版本号(1.1),这是HTTP请求行。其余部分采用键/值对的形式发送,包含了URL等信息,我们称之为请求头。
服务器在接收到信息后,根据URL找到图片文件,并将其发送给客户端。HTTP响应报文(第二部分)的第一行说明了采用的是协议HTTP、版本号为1.1;“200 OK”表示本次请求正常处理,这是 HTTP 响应状态行;其余部分称为响应头,服务器可以在这部分向客户端传递附加信息,例如,Content-Type用来说明资源的类型,Content-Length用来指明资源的长度。
第三部分内容是响应体,这里服务器向客户端响应的是一张图片。客户端在接收到响应报文后,将响应体的内容呈现给用户。
通过以上过程的描述可以发现,HTTP请求报文主要由请求行、请求头和请求体组成,如图1-6所示。
图1-6 HTTP请求报文的组成
(1)请求行。位于请求报文的第一行,对报文进行描述,由请求方法、资源路径和协议版本组成。请求方法包括GET、POST等,它告诉服务器要执行怎样的操作。资源路径是指服务器根目录下的相对目录。
(2)请求头。由键/值对组成,每行一对,键和值用冒号“:”(英文)分隔,可以有多行键/值对,也可以不使用。请求头用于向服务器传递附加信息,如请求正文的长度、浏览器的类型等。
(3)请求体。包含请求数据。若采用GET方式,则没有请求体;若采用POST方式,则包含请求体。POST方式常用于需要客户填写表单的场合,用户数据将作为请求体发送给服务器。
HTTP响应报文主要由状态行、响应头和响应体组成。
(1)状态行。位于响应报文的第一行,由 HTTP 版本号、状态码和状态消息组成。状态码反映了服务器对客户端请求的响应状态,可以表示请求是否被理解、满足。状态码由3位数字组成,其中首位数字规定了响应状态的类别。表1-1列举了5种响应状态的类别及状态码首位取值规则。
表1-1 状态码及响应状态的类别
其中比较常见的几个状态码的含义如下。
①200(成功):表示客户端的请求成功,请求所希望的响应头、数据体将在本响应消息中返回。
②301(永久移动):指出请求的资源已经被移动到新的URL,响应信息会包含新的URL,客户端会自动定向到新的URL。
③404(找不到):服务器无法找到客户端请求的资源。
④500(服务器内部错误):服务器遇到错误,无法处理请求。
(2)响应头。与请求头类似,是一个键/值对的列表,为响应报文添加一些附加信息。例如,被请求资源需要的认证方式、页面资源的最后修改时间等。
(3)响应体。服务器返回给客户端的文件、数据等。如果客户端请求的是网页,那么响应体就是HTML代码。