HTTP头部信息

课后整理 2020-12-20

HTTP(HyperText Transfer Protocol,超文本传输协议)是一种应用层协议,负责超文本的传输,如文本、图像、多媒体等。HTTP由两部分组成:请求(Request)和响应(Response),简单说明如下。

请求

HTTP请求信息由3部分组成:请求行、消息报头、请求正文(可选)。格式如下:

<request-line>
<headers>
<blank  line>
[<request-body>]

请求行以一个方法符号开头,以空格分隔,后面跟着请求的URI和协议的版本。格式如下:

Method  Request-URI HTTP-Version CRLF

请求行各部分说明如下。

请求行后是消息报头部分,用来说明服务器需要调用的附加信息。

在消息报头后是一个空行,然后才是请求正文部分,即称之为主体部分(body),该部分可以添加任意的其他数据。

【示例1】在浏览器地址栏中输入www.baidu.com,则GET请求如下所示。

GET /  HTTP/1.1
Host:  www.baidu.com
User-Agent:Mozilla/5.0  (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.8) 
Gecko/2017032609  Firefox/13.0.8
Connection:  Keep-Alive

请求行的第一部分说明了该请求是GET请求。该行的第二部分是一个斜杠(/),用来说明请求的是百度域名的根目录。该行的最后一部分说明使用的是HTTP 1.1版本,另一个可选项是HTTP 1.0。

第二行是请求的第一个消息报头,HOST头部指出请求的域名。结合HOST头部和上一行中的统一资源标识符(即斜杠),就可以确定请求服务器的具体地址。

第三行包含的是User-Agent头部,服务器端和客户端脚本都能够访问它,该头部包含的信息由浏览器来定义,并且在每个请求中将会自动发送。JavaScript和服务器通过User-Agent头部信息,可以了解客户端的本地情况。

最后一行是Connection头部,通常将浏览器操作设置为Keep-Alive,在最后一个头部后有一个空行(即使不存在请求主体)。

【示例2】如果在GET请求中附带参数,则必须将这些参数信息附在URL后面,这个信息也被称之为查询字符串(Query String),发送时将被附加在请求行中,格式如下所示:

GET /bbs/?user=css8%20 HTTP/1.1

Host:  www.mysite.cn
User-Agent:Mozilla/5.0  (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.8) 
Gecko/2017032609  Firefox/13.0.8
Connection:  Keep-Alive

【示例3】POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。

POST  / form.asp HTTP/ (CRLF)
HOST:www.mysite.cn  (CRLF)
User-Agent:Mozilla/5.0  (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.8) 
Gecko/2017032609  Firefox/13.0.8
Content-Type:  application/x-www-form-urlencoded
Content-Length:22  (CRLF)
Connection:Keep-Alive  (CRLF)
Cache-Control:no-cache  (CRLF)
(CRLF)                        // 该CRLF表示消息报头已经结束,在此之前为消息报头
user=css8&pwd=111111  // 此行以下为提交的数据

POST请求与GET请求之间略有区别。首先,请求行开始处的GET变为POST,在后面有两个新行。其中Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/ x-www-form- urlencoded的编码格式来传送数据,这是针对简单URL编码的MIME类型。

Content-Length说明了请求主体的字节数。在Connection后是一个空行,再后面就是请求主体。与大多数浏览器的POST请求一样,都以“名称/值”对的形式表示的。HEAD方法与GET方法的数据传输形式几乎是一样的。

响应

HTTP响应也由三部分组成:状态行、消息报头、响应正文(可选)。格式如下:

<status-line>
<headers>
<blank  line>
[<response-body>]

其中状态行格式如下:

HTTP响应也由三部分组成:状态行、消息报头、响应正文(可选)。格式如下:

HTTP-Version  Status-Code Reason-Phrase CRLF

状态行的各部分说明如下。

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

常见状态码、状态描述、说明如下:

200  OK                 // 客户端请求成功
400  Bad Request    // 客户端请求有语法错误,不能被服务器所理解
401  Unauthorized  // 请求未经授权,这个状态代码必须和WWW-Authenticate报头

域一起使用

403  Forbidden       // 服务器收到请求,但是拒绝提供服务
404  Not Found       // 请求资源不存在,eg:输入了错误的URL
500  Internal Server Error      // 服务器发生不可预期的错误
503  Server Unavailable         // 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常

【示例4】下面是一个HTTP响应的示例。

HTTP/1.1  200 OK
Date:  Wed, 08 Apr 2017 03:35:50 GMT
Content-Type:  text/html;charset=gb2312
Content-Length:  1700
 
<html>
<head>

<title>百度一下,你就知道</title>
</head>
<body>
<!--  body -->
</body>
</html>

在状态行之后是消息头。一般服务器会返回一个名为Data的信息,用来说明响应生成的日期和时间。接下来就是与POST请求中一样的Content-Type和Content-Length。响应主体所包含的就是所请求资源的HTML源文件。