
1.3 HTTP
HTTP 是互联网上应用最广泛的一种网络协议。它允许将 HTML 文档从 Web 服务器传送到Web浏览器。在Web浏览器和Web服务器之间的通信,从HTTP的角度看,Web浏览器就是一个 HTTP 客户,在 Web 服务器收到 HTTP 客户的请求后,根据需求进行处理,再把结果返回给Web浏览器。
1.3.1 什么是HTTP
HTTP是通用的、无状态的、面向对象的协议。HTTP的版本分别是:HTTP1.0、HTTP1.1和HTTP-NG。HTTP的消息分为请求消息和响应消息。
1.3.2 URL含义
统一资源定位符(URL)用来标识万维网上的各种资源,如文档、图像、声音等。URL由3个部分组成:协议类型、主机名和路径及文件名。
HTTP的URL的一般格式如下。
http://host[":"port][path]
其中,http表示此处要使用HTTP协议来定位网络资源;
host表示表示合法的Internet主机域名,或者是主机的IP地址;
port表示指定端口号。默认情况下,HTTP的端口号为80,可以省略;
path表示请求资源的路径,由零个或多个“/”符号间隔的字符串组成。表示主机上的一个目录或文件地址,该参数可以省略。若没有该项,则URL会指向Internet上的某个主页。
例如,如果用户想查询获取百度文库中的资料,则可以先进入百度文库的主页,其对应的URL为:http://wenku.baidu.com/,如图1.2所示。

图1.2 URL示例
该URL只给出了主机名,省略了端口号和URI,即使用默认端口号80,而该URL则指向了百度文库的主页,进入主页后可以根据全库搜索或者主页的链接来查找相关信息。
1.3.3 HTTP请求
HTTP的请求包括:请求行、请求报头和请求体3个部分。其中,某些请求报头和请求体的内容是可选的,它们之间需要用空行隔开。
1.请求行
请求行包含:方法(Method)、请求资源的URI(Request-URI)和HTTP版本(HTTP-Version) 3个内容,其格式如下。
Method Request-URI HTTP-Version CRLF
其中,CRLF表示回车和换行,方法(Method)指的是操作或命令。
2.请求报头
请求报头包含客户端请求的附加信息及自身信息。常用的请求报头有 Accept 和 User-Agent两种。Accept 用于指定客户端所接受的信息类型。常有多个Accept行,例如:
Accept: text/html
Accept: image/gif
表明客户端可接收图像和HTML或文本文件。
User-Agent 用于将发送请求客户端的操作系统名称和版本信息、浏览器的名称和版本信息等客户端信息通知服务器。
3.请求体
请求报头体也称为请求正文,是可选部分,例如GET请求就没有请求体。
4.GET方法与POST方法
HTTP中包含了多种方法,在需要的时候可以查询相关协议文档。通常最常用的方法是GET方法和POST方法。使用GET方法和POST方法来传递参数是不同的。
GET方法是最简单的HTTP方法,它的主要任务就是向服务器请求资源,并得到资源。资源的类型可能是HTML页面、JPEG图像,也可以是PDF文档、Word文档等。GET方法的关键就是要从服务器获得资源。
使用GET方法时,在URL地址后面常常可以附加一些参数,下面是一个使用GET方法的请求行:
GET http://www.apache.org.org/servlet?param1=abc¶m2=def HTTP/1.1
注意
● 总字符数有限制,这和服务器有关。若地址栏中输入的文本过长,可能会导致GET方法无法正常工作。
● 参数会追加到请求URL后面,且以“?”开头。多个参数之间使用“&”进行分隔。
● 数据会追加到URL的后面,而且在浏览器的地址栏中显示,所以不要使用GET方法发送敏感数据。
● 数据量一般不超过1KB。
和GET方法的区别在于,POST方法不仅可以向服务器请求资源,而且同时可以向服务器发送表单数据。使用POST方法发送数据的示例如下。
POST /index.html HTTP/1.1 /*请求行*/
HOST:www.baidu.com /*存放所请求对象的主机*/
User-Agent:Mozilla/4.5(WinNT) /*指定用户代理*/
Accept: text/html /*HTML文本文件*/
Accept-language:zh-cn /*指定可接受的语言-中文*/
Content-Length: 22 /*实体内容长度*/
Connection: keep-alive /*一直保持连接*/
param1=abc¶m2=def /*提交的参数*/
注意
● 使用POST方法请求时,参数被放到消息体中,因此不受地址栏中文本过长的限制,而且这些参数并不会直接显示在地址栏上。
● 传递的数据量没有限制。需要将请求报头 Content-Type 设置为 application/x-www-form -urlencoded,将Content-Length设置为实体内容的长度。
1.3.4 HTTP响应
在接收到一个请求后,服务器会返回一个HTTP响应。HTTP响应包括:状态行、响应报头和响应正文3个部分。
1.状态行
状态行包括:HTTP 版本(HTTP-Version)、状态码(Status-Code),以及解释状态码的简单短语(Reason- phrase)3个部分,其格式如下。
HTTP-Version Status-Code Reason-phrase CRLF
其中,状态码由三位数字组成,共有5大类33种,其第一个数字指定了响应类别,取值为1~5,后面两位没有明确的规定。具体的含义如下。
● 1xx:指示信息,例如:请求收到了或正在处理。
● 2xx:成功。
● 3xx:重定向,即通过各种方法将各种网络请求重新定个方向转到其他位置。
● 4xx:客户端错误,例如:请求中含有错误的语法或不能正常完成。
● 5xx:服务器端错误,例如:服务器出现异常而无法完成请求。
典型的响应状态码解释如下。
● 200:表示请求成功,并成功返回了请求的资源。
● 302:表示临时重定向,此时被请求的文档已经临时移动到其他位置,该文档新的 URL将在Location响应报头中给出。
● 400:表示错误请求。
● 401:表示浏览器访问的是一个受到密码保护的页面。
● 403:表示服务器收到请求,但拒绝提供服务。
● 404:表示访问的网页不存在,即服务器上不存在浏览器请求的资源。
● 500:表示内部服务器错误,即CGI、ASP、JSP等服务器端的程序发生了错误。
● 503:表示服务器超时。用户请求量比较大,服务器暂时性超载,不能处理当前的请求,例如:12306网站春节前购票,双十一淘宝购物都可能出现这样的状态响应。
2.响应报头
有了响应报头,服务器就可以传递不能放在状态行中的附加响应信息,服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
3.响应正文
响应正文是指服务器所返回的资源内容,如HTML页面。响应报头和响应正文之间必须使用空行来分隔。HTTP响应示例如下。
HTTP/1.1 200 OK /*状态行,给出服务器正在运行的HTTP版本号和应答代码"200 OK"表示请求完成。*/
Connection: close /*连接状态*/
Date: Wed, 19 Nov 2011 02:20:45 GMT /*日期*/
Server: Apache/2.0.54(Unix) /*服务器*/
Content-Length:397 /*指定数据包含的字节长度*/
Content-Type: text/html /*指定返回数据的MIME类型*/
/*空行*/
<html>
<body>
/*数据*/
</body>
</html>
极客学院
jikexueyuan.com
极客学院在线视频学习网址:
http://www.jikexueyuan.com/course/1706.htmll
手机扫描二维码

细说HTTP的报文格式和工作流程