1.资源(Resource)
什么是资源,首先我们看《架构风格与基于网络的软件架构设计》的作者:Roy Thomas Fielding对资源的一个说明
Roy Thomas Fielding 写道
REST对于信息的核心抽象是资源。任何能够被命名的信息都能够作为一个资源:一份文档或一张图片、一个暂时性的服务(例如,“洛杉矶今日的天气”)、一个其他资源的集合、一个非虚拟的对象(例如,人)等等。换句话说,任何可能作为一个创作者的超文本引用的目标的概念都必须符合资源的定义。一个资源是到一组实体的概念上的映射,而不是在任何特定时刻与该映射相关联的实体本身。
更精确地说,资源R是一个随时间变化的成员函数MR(t),该函数将时间t映射到等价的一个实体或值的集合,集合中的值可能是资源的表现和/或资源的标识符。一个资源可以映射到空集,这允许在一个概念的任何实现存在之前引用这个概念——这一观念对于Web之前的大多数超文本系统来说比较陌生 [61]。一些资源在它们被创建后的任何时刻来检查,它们都对应着相同的值的集合,从这个意义上说它们是静态的。其他的资源所对应的值则会随时间而频繁地变化。对于一个资源来说,唯一必须是静态的是映射的语义,因为语义才是区别资源的关键。
简而言之,资源是一个抽象的东西,而在具体资源访问时,会根据内容协商的结果表示成一个具体表述(Representations)。每个资源由统一的资源标识符(URI)来描述,类似于资源的ID,或者说资源的地址。
2.表述(Representations)
表述是资源的具体表现形式,譬如,今天深圳的天气(资源),可以使用一副天气jpg图来描述,也可以XML数据来描述,也可以使用HTML的页面来描述,一种资源可以有多种表述,也就是说,通过同一个URI地址可以获取到多种表现形式,而具体怎么表现,则取决于Web客户端与Web服务端内容协商的一个结果。
3.内容协商
客户端和服务端通过内容协商来协商请求内容和响应内容的格式,主要协商的内容包括:
请求协商:
1)字符集(Accept-Charset):客户端通过发送该协商建议服务端使用该字符集来发送响应结果,譬如
Accept-Charset=gb2312,utf-8;q=0.7,*;q=0.7,客户端建议服务端优先使用gb2312或者utf-8来发送响应结果
2)请求编码(Accept-Encoding):客户端告诉服务端客户端所支持的编码格式,譬如Accept-Encoding =gzip,deflate表明客户端支持gzip压缩或者普通响应的结果
3)语言(Accept-Language):客户端通过发送该协商告诉服务端客户端所使用的语言,譬如Accept-Language=zh-cn,zh;q=0.5表明客户端偏号的语言是中文,譬如对于”今天深圳的天气“这个资源来说,服务端可以通过该选项决定使用什么语言来表述资源
4)表述偏好(Accept):客户端通过该选项告诉服务端其表述的偏号,譬如一个请求”今天深圳的天气“的Ajax程序,可以通过设置表述偏好为Accept=application/json来告诉服务端,希望得到Json描述的结果,而一个浏览器则可以通过传输表述偏好为Accept=text/html来告诉服务端,希望得到Html描述的结果
响应协商:
1)表述/表述字符集(Content-Type):服务端通过该协商告诉客户端表述的格式和字符集的情况,譬如Content-Type=text/html; charset=utf-8表示响应内容格式为Html,字符集为utf-8
2)表述编码(Accept-Encoding):服务端通过该协商告诉客户端表述的编码,譬如Content-Encoding=gzip服务端告诉客户端内容使用gzip压缩
4.方法
方法定义了对资源的操作,主要的方法包括GET、POST、UPDATE、DELETE等等,它们分别代表了对资源的读、建、改、删的操作
5.缓存
HTTP协议支持在Web的各个节点对资源的表述进行缓存,譬如在浏览器客户端、代理服务器、反向代理服务器、目标服务器等上对表述进行缓存(注意,此处的缓存不仅仅是指在目标服务器上进行的业务级别的缓存)
1)客户端请求
如果客户端缓存了某些表述,则在进行读请求(GET)时,携带请求条件(所谓的条件GET,使用Cache-Control指令),服务端接收到客户端的请求条件,比较确认客户端的表述是否过时,如果没有,则返回304响应,否则则把最新的表述响应给客户端
2)服务端响应
服务端对一些需要缓存的表述,则响应中携带缓存指令,告诉请求客户端如何对表述进行缓存
3)方法对缓存的影响
当对一个资源进行UPDATE或DELETE时,请求途经的所有服务器(如代理服务器、反向代理服务器、目标服务器)会自动将该资源对应的所有表述 缓存失效。
6.状态码
状态码描述了资源请求的结果,主要状态码包括:
1)1XX:信息类
2)2XX:成功类
典型的成功响应包括:
200 OK,表示请求正常处理
201 Created,表示POST请求已经接受,资源已创建,对于此响应,一般响应会携带新建资源的Reference给请求客户端
202 Accepted,表示POST/UDATE请求已经接受,但不一定处理,譬如对于POST/UPDATE请求为后台新建线程处理,可以使用该响应码
3)3XX: 重定向类
典型的重定向响应包括:
300 Multiple Choice:表明请求的资源有多种表述
301 Moved Permenently:表明所请求的资源已转移到其他位置,建议到新的位置上去请求资源
304 Not Modify:主要是针对携带条件的GET请求,服务端向客户端表明所请求的资源没有发生变化,可以继续使用客户端已缓存的数据
4)4XX: 客户端错误类
典型的客户端错误响应包括:
400 Bad Request:表明客户端的请求格式服务端无法识别
403 Forbiden:客户端要访问的资源权限受限,不允许访问
404 Not found:客户端要访问的资源不存在
405 Method Not Allowed:客户端请求的方法不允许,譬如有可能一个资源不允许删除,则不允许进行DELETE请求
408 Request Timeout:请求超时
5)5XX: 服务端错误类
典型的服务端响应包括:
500 Internal Server Error:服务器内部错误,无法响应
503 Service Unavailable:服务器无法处理当前请求
504 Gateway Timeout:网关超时