作者:Jason Chen
HTTP是web客户端和服务端的通讯的应用层协议,通常基于TCP/IP。交互方式如下:
1. 客户端和服务端建立连接
2.客户端发送请求
3.服务端响应请求
4.关闭连接
由于创建/关闭连接的代价很大,所以,在HTTP1.1之后,一个连接之内,可发发送多次请求。
下面主要介绍客户端的请求和服务端的响应。
一、请求格式
请求格式包括起始行,请求消息头部和请求消息正文。看下图:
1.起始行
起始行包含HTTP方法,URI和HTTP版本,格式如下:
http_method URI http_version
- HTTP方法有以下几种:
GET : 获取URI表示是资源
POST : 将资源上传到URI指定的位置。
PUT : 上传资源,将资源上传到URI指定的位置。
DELETE : 删除URI指定的资源
HEAD : 和get类似,但是它只返回消息头部,不返回消息正文
TRACE : 回显客户端请求进行调试
OPTIONS : 查询服务器的能力,看服务器能如何处理一个资源。
POST和PUT的主要区别是,PUT是幂等性的,即重复提交多次与提交一次的效果是一样的。POST不是幂等性的。
- URI
通常使用URL来表示,包含5个部分:协议,主机名称(或IP名称,端口号可选,默认是80),路径,片段标识符和查询字符串。看下面的例子:
http://abcd/buy/index.html?pay=123456#fragment
http是协议,主机是abcd, 路径是/buy/html.index,片段标识符是fragment,查询字符串是pay=123456。
- http版本
即请求的http协议的版本。
2. 请求消息头部
消息头部是由一些key:value的值对组成的,以一个空行结束。key不区分大小写,只能是ASCII符号。有以下几种key:
cache-control: 指定缓存机制
Connection: 两种值,keepalive和close。值为keep-alive时, 客户端到服务器端的连接持续有效。当出现对服务器的后继请求时,keepalive功能避免了建立或者重新建立连接.
date:消息发送的时间
Etag:资源每次修改,Etag都会改变。用于判断资源是否有更改。
If-Match:如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。
If-None-Match:如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。
Accept : 申明自己的接受的数据类型,通常使用MIME类型
Accept-Encoding:申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法 (gzip,deflate)
Accept-Language:申明自己接收的语言语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。
Authorization:当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,该头部来回应自己的身份验证信息给WEB服务器
Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。
Pramga:主要使用 Pramga: no-cache,相当于 Cache-Control: no-cache。
Range:(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。
Referer:向 WEB 服务器表明自己是从哪个网页/URL 获得/点击当前请求中的网址/URL。
User-Agent: 表明自己的身份
Accept-Charset:申明自己接收的字符集
3.请求消息正文
当使用PSOT或PUT的方法时,就需要上传数据给服务器。数据就是在消息正文中。
二、响应格式
响应格式包括:状态行,响应消息头部和响应消息正文。请看下图:1.响应行
响应行包括HTTP版本,响应码和响应描述。响应码有以下几类:
1XX : 信息
2XX:请求成功,最常见的是200
3XX:重定位及重定向
4XX:客户端错误
5XX:服务端错误
2.响应消息头部
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。同样是由key : value组成,以一个空行结束。主要有以下几种key:
cache-control: 指定缓存机制
Connection:值为close,keepalive和keep-alive
Content-Encoding:服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。
Content-Language:服务器告诉浏览器自己响应的对象的语言。
Content-Length: 服务器告诉浏览器自己响应的对象的长度。
Content-Range: 服务器表明该响应包含的部分对象为整个对象的哪个部分。
Content-Type: 服务器告诉浏览器自己响应的对象的类型
Etag:资源每次修改,Etag都会改变。用于判断资源是否有更改。
If-Match:如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。
If-None-Match:如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。
Expired:服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。是 HTTP/1.0 的头部。
If-Modified-Since:如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。
If-Unmodified-Since:如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。
Last-Modified:服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。
Location:服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取
Server: 服务器表明自己是什么软件及版本等信息。
Transfer-Encoding: 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)。
WWW-Authenticate:响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
3.响应消息正文
引用查询资料出处
http://blog.csdn.net/mad1989/article/details/7918267
http://baike.baidu.com/link?url=A5yY9gCdeuJcBsyJpvlgca2RSvEQIaFbbvJSa7zo5MZk65c6ZRjawN_n_joJ0BSu71GlvfWfpFb8Grfhawwxsa#3
http://www.cnblogs.com/ok-lanyan/archive/2012/07/14/2591204.html
http://www.cnblogs.com/ziwuge/archive/2011/09/27/2193385.html