URL详解
http是一个基于请求与相应模式的,无状态的,应用层的协议,常基于TCP链接,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:http://host[“:”port][path]
其中,http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,若空则使用缺省的80端口;path指定请求资源的URI;如果URL中没有给出path,那么当它作为请求URI时,必须以“/”的形式给出,但通常浏览器会帮我们完成这个工作。比如在浏览器地址栏 输入: www.guet.edu.cn, 浏览器自动换成http://www.guet.edu.cn/。
HTTP请求
HTTP请求分为三部分,分别是请求行,消息报头,请求正文。
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:
Method Request-URI HTTP-Version CRLF
其中, Method表示请求方法,一般为GET, POST, PUT, DELET;Request-URI是一个统一资源标识符, 例如/index.jsp;HTTP-Version表示请求的HTTP协议版本, 比如HTTP/1.1;CRLF表示回车和换行符(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。请求方法除了上述提到的GET, POST, PUT, DELETE外,还有TRACE, CONNECT,OPTIONS,其各个方法的解释如下:
请求方式 | 含义 |
---|---|
GET | 请求获取Request-URI所标识的资源 |
POST | 在Request-URI所标识的资源后附加新的数据 |
HEAD | 请求获取由Request-URI所标识的资源的响应消息报头 |
PUT | 请求服务器存储的一个资源,并用Request-URI作为标示 |
DELETE | 请求服务器删除Request——URI所标示的资源 |
TRACE | 请求服务器回送收到的请求信息,主要用于测试或者诊断 |
CONNECT | 保留将来使用 |
OPTIONS | 请求查询服务器的性能,或者查询与资源相关的选项和需求 |
HTTP响应
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
HTTP的响应消息也是由三个部分组成,分别是:状态行、消息报头、响应正文。
状态行格式如下:HTTP-Version Status-Code Reason-Phrase (CRLF)
其中,HTTP-Version表示服务器HTTP协议的版本, 例如HTTP/1.1;Status-Code表示服务器发回的响应状态代码, 例如200;Reason-Phrase表示状态代码的文本描述,例如OK。- HTTP状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
状态码 | 状态码含义 |
---|---|
1XX | 指示信息–表示请求已接收,继续处理 |
2XX | 成功–表示请求已被成功接收、理解、接受 |
3XX | 重定向–要完成请求必须进行更进一步的操作 |
4XX | 客户端错误–请求有语法错误或请求无法实现 |
5XX | 服务器端错误–服务器未能实现合法的请求 |
HTTP消息报头
不管是请求消息还是响应消息,都由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头,空行(只有CRLF的行),消息正文组成。HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。每一个报头域都是由名字+”:”+值 组成,消息报头域的名字是大小写无关的,域值前可以有任意个空格(但通常会在前面添加一个空格),可以允许多个相同的消息包头。
- 普通报头
普通报头中包含请求消息和响应消息都支持的头域,有Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。
Cache-Control: 用于指定缓存指令。缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)。
Cache-Control的各种取值的含义
Cache-Control的取值 | 含义 |
---|---|
public | 指示响应可被任何缓存区缓存。 |
Private | 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 |
no-cache | 指示请求或响应消息不能缓存 |
no-store | 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 |
max-age | 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 |
min-fresh | 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 |
max-stale | 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。 |
- 响应报头
响应报头允许服务器传递的附加响应信息,以及关于服务器的状态信息以及对Request-URI所标识的资源进行下一步访问的信息。
常用的响应报头的信息
响应报头 | 具体含义 |
---|---|
Location | 用于提示客户端重定向到一个新的位置。Location响应报头域常用在更换域名的时候。 |
Server | 包含了服务器用来处理请求的软件信息。比如Server: Play! Framework; 1.2.3。1.2.3搭建的应用服务程序,该程序处于生产模式。 |
Connection | |
Proxy-Connection | |
Set-Cookie | cookie信息 |
- 实体报头
请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(例如有无实体正文)和请求所标识的资源的元信息。
常用的实体报头信息
实体报头的信息 | 具体含义 |
---|---|
Content-Encoding | 用于记录文档的压缩方法。比如 Content-Encoding:gzip |
Content-Language | 描述了资源所用的自然语言。ru没有设置该域, 则认为实体内容将提供给所有的语言阅读 |
Content-Length | 用于指明实体正文的长度,单位字节, 十进制数表示 |
Content-Type | 指明发送给接收者的实体正文的媒体类型,比如Content-Type:text/html;charset=ISO-8859-1, 表示正文是一个html文档,采用ISO-8859-1编码 |
Last-Modified | 用于指示资源的最后修改日期和时间。 |
Expires | 给出响应过期的日期和时间。 |
为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires指定页面过期的时间。比如Expires:Thu,15 Sep 2006 16:23:12 GMT
HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。例如,为了让浏览器不要缓存页面,我们可以将Expires设为0,jsp中程序如下:response.setDateHeader(“Expires”,”0”);