HTTP(HyperText Transfer Protocol,超文本传输协议)是一种应用层协议,负责超文本的传输,如文本、图像、多媒体等。HTTP由两部分组成:请求(Request)和响应(Response),简单说明如下。
请求
HTTP请求信息由3部分组成:请求行、消息报头、请求正文(可选)。格式如下:
<request-line> <headers> <blank line> [<request-body>]
请求行以一个方法符号开头,以空格分隔,后面跟着请求的URI和协议的版本。格式如下:
Method Request-URI HTTP-Version CRLF
请求行各部分说明如下。
- Method:表示请求方法,请求方法以大写形式显示,如POST、GET等。HTTP定义了大量的请求类型,不过Web开发常用GET和POST请求。只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源。
- Request-URI:表示统一资源标识符。
- HTTP-Versio:表示请求的HTTP协议版本。
- CRLF:表示回车和换行,除了作为结尾的CRLF外,不允许出现单独的CR或LF字符。
请求行后是消息报头部分,用来说明服务器需要调用的附加信息。
在消息报头后是一个空行,然后才是请求正文部分,即称之为主体部分(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
状态行的各部分说明如下。
- HTTP-Version:表示服务器HTTP协议的版本。
- Status-Code:表示服务器发回的响应状态代码。
- Reason-Phrase:表示状态代码的文本描述。
状态代码有3位数字组成,第一个数字定义了响应的类别,且有5种可能取值。
- 1xx:指示信息。表示请求已接收,继续处理。
- 2xx:成功。表示请求已被成功接收、理解或接受。
- 3xx:重定向。要完成请求必须进行更进一步的操作。
- 4xx:客户端错误。请求有语法错误,或者请求无法实现。
- 5xx:服务器端错误。服务器未能实现合法的请求。
常见状态码、状态描述、说明如下:
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源文件。