Web请求、响应的核心是HTTP协议。HTTP是一个应用层的协议,主要有如下特点:
1) 客户端-服务端模式(请求-响应模式);
2) 简单快速:客户端向服务器发送请求时,只需传送请求方法和URL;
3) 无状态:HTPP协议是无状态的,在每次请求-响应完成后,服务器将断开TCP连接;
HTTP是基于请求-响应的、无状态的、基于TCP的应用层协议。在发送HTTP请求时,必须要确定资源的路径。
HTTP URL(URL是一种特殊类型的URI):包含了用于查找某个资源的信息,其格式如下:
http://host[:port][abs_path]
http:表示通过HTTP协议来定位网络资源;
host:表示合法的Internet地址或IP地址;
port:指定服务器端口号,缺省为80;
abs_path:指定请求的URI,如果URL中没有abs_path,那么当它作为请求URI时必须以“/”的形式表示(浏览器自动完成),如在浏览器输入www.baidu.com时,浏览器会自动转换成http://www.baidu.com/。
HTTP请求由三部分组成,分别是:请求行、消息头、请求正文。示例如下:
POST /index.htmlHTTP/1.1 (CRLF) //请求行
Accept:text/plain,text/html(CRLF) //以下为消息头
Accept-Language:zh-cn(CRLF)
Content-Length:19(CRLF)
Accept-Encoding:gzip(CRLF)
Connection:keep-alive(CRLF)
Host:localhost:8080(CRLF)
User-Agent:Mozilla/5.0(CRLF)
(CRLF) //空行
user=ssl&pwd=123456 //正文
请求行以一个请求方法符号开头,后面跟着请求的URI和协议版本,各个部分以空格分开,格式为:request-methodrequest-uri http-version CRLF 。
其中request-method表示请求的方法,常用的方法有get和post;request-uri:表示网络资源的完整路径;http-version:表示HTTP协议的版本;CRLF表示回车和换行(除了使用CRLF作为结尾外,不允许出现单独的CR或LF字符)。
请求头包含包含了浏览器使用的语言,接收的媒体类型等信息;各个请求头之间用CRLF分隔;
常见的HTTP请求头
请求头 |
说明 |
Accept |
指定客户端接收那些媒体类型 |
Accept-Charset |
用于指定客户端接受的字符集 |
Accept-Encoding |
用于指定可接受的内容编码,如gzip,deflate |
Accept-Language |
用于指定一种自然语言 |
Host |
用于指定被请求资源的Internet主机和端口号 |
User-Agent |
用于指定客户端使用的浏览器、操作系统等 |
Connection |
当前连接是否保持 |
Pragma |
指定请求的内容是否被缓存(HTTP/1.0) |
Cache-Control |
作用和Pragma类似(HTTP/1.1) |
在请求头和请求正文之间与一个空行,该空行只有一个CRLF符。这个空行对HTTP请求格式非常重要,CRLF告诉HTTP服务器请求正文从哪里开始。
HTTP响应也是由三部分组成,分别是:状态行、消息头、响应正文。示例如下:
HTTP/1.1200 OK (CRLF) //状态行
Server:Microsoft-IIS/4.0(CRLF) //消息头
Content-Type:text/html(CRLF)
Content-Length:122(CRLF)
Last-Modified:Mon,5Jan 2015 13:13:12 GMT (CRLF)
(CRLF) //空行
<html> //响应正文
<head>
<title>HTTP ResponseExample</title>
</head>
<body>
Welcome to Binary Software
</body>
</html>
状态行格式为:http-versionstatus-code reason-phrase CRLF;各个部分以空格分隔,其中http-version:表示HTTP协议的版本;status-code:服务器返回的状态码;reason-phrase:表示状态码的描述;CRLF表示回车和换行(除了使用CRLF作为结尾外,不允许出现单独的CR或LF字符)。
常见的HTTP响应状态码
状态码 |
状态描述 |
说明 |
200 |
OK |
请求成功 |
400 |
Bad Request |
客户端请求语法错误 |
401 |
Unauthorized |
请求未经授权 |
402 |
Forbidden |
服务器拒绝服务 |
404 |
Not Found |
资源不存在 |
500 |
Internal Server Error |
服务错误 |
503 |
Server Unavailable |
服务不能处理请求 |
总结:状态码有三位数字,第一位数字定义了响应的类别,如下
1xx:指示信息,表示请求已接受
2xx:表示请求已被成功接收、处理
3xx:重定向
4xx:客户端错误
5xx:服务端错误
常见的HTTP响应头
响应头 |
说明 |
Server |
使用的服务器名称 |
Content-Type |
服务器返回的正文媒体类型 |
Content-Encoding |
与请求头的Accept-Encoding对应 |
Content-Language |
描述了资源所用的自然语言,与Accept-Language对应 |
Content-Length |
正文的长度 |
Keep-Alive |
保持连接的时间 |
在消息头和响应正文之间与一个空行,该空行只有一个CRLF符。
浏览器缓存是一个比较重要的机制,当我们希望获取最新的数据,而不是缓存数据时,需要在HTTP请求头添加一些信息,以告诉服务器要获取最新的数据,而不是缓存数据。
Cache-Control:用于指定是否缓存的指令,缓存指令是单向且独立的,也即:在响应头中出现的缓存指令未必在请求头中出现,并且一个请求的缓存指令并不会影响其他请求的缓存指令。
请求时Cache-Control的常用取值为no-cache,表示请求的所有内容不会被缓存;
响应时,Cache-Control的常用取值有:
l public:所有内容都被缓存;
l private:内容只缓存到私有缓存中;
l no-cache:所有内容被不会被缓存;
l no-store:所有内容都不会被缓存到Internet的临时文件中;
l max-age=xxx:缓存的内容将在xxx秒后失效,只在HTTP1.1中可用,和Last-Modified一起使用时优先级较高;
Cache-Control请求字段被各个浏览器支持的比较好,而且它的优先级也比较高,它和其他字段(如Expires)同时出现时,Cache-Control将覆盖其他字段。Pragma字段的作用和Cache-Control类似,最好是pragma和Cache-Control一起使用,如Pragma:no-cache;Cache-Control:no-cache。
Expires字段后面跟着一个日期和时间,超过这个时间值后,缓存的内容将失效,也就是浏览器在发出请求之前先检查这个页面的Expires字段,若过期就重新向服务器发送请求。
Last-Modified字段一般用于表示一个服务器上资源的最后修改时间,以便确定当前请求的资源是否是最新的。一般服务端在相应头中返回一个Last-Modified字段,告诉浏览器这个页面的最后修改时间,浏览器再次请求时在请求头中增加一个If-Modified-Since字段,询问当前缓存的页面是否是最新的,如果是最新的就返回304状态码,告诉浏览器是最新的,服务器也不会传输新的数据。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/sunshuolei/article/details/48086593