火龙果整理uml.org.cnREST式架构及实践火龙果整理uml.org.cnREST究竟何物?REST(RepresentationalStateTransfer):表述性状态转移,分布式超媒体软件的一种架构风格。源自2000年RoyThomasFielding的博士论文。一套简单的设计原则、一种架构风格(或模式),不是一种具体的标准或架构。基于使用HTTP、URI等现有的广泛流行的协议和标准,并由几个核心抽象概念支撑。对Web的本质回归:一种真实描述Web的方式,不被特定时期的特定应用程序概念歪曲。提供区分良好实践和糟糕实践的途径:判断特定实践是否与Web架构一致。2火龙果整理uml.org.cn论文中文摘要堪称Web架构设计领域的“圣经”中文版下载3火龙果整理uml.org.cn回顾Web火龙果整理uml.org.cnWeb1.0核心组件HTTP(HypertextTransferProtocol):超文本传输协议。一种基于文档的轻量级网络协议,建立在可靠性和扩展性高的TCP/IP协议基础之上。URL(UniformResourceLocator):通用资源定位符,一种文档地址的表示方案,是Web1.0的关键。例:指定协议定位符,对应域名系统对应大部分文件系统层次结构HTML(HypertextMarkupLanguage):超文本标识语言,一种基于标签的简单文档格式,主要显示静态网页内容。5火龙果整理uml.org.cnWeb1.0-Web2.0的转变Web1.0的误区:对大多数用户而言,Web不过是一个只读文件仓库!Web2.0颠覆用户错误观念:Web不再是简单的文档仓库!Web是双向的!!重新审视Web作为全球信息空间的概念,Web2.0更加丰富的含义:“Web数据”和“平台化的Web”。底层基础设施未变化,真正的区别:使用基础设施的方式。网站就是Web服务,Web作为分布式编程平台具备极大的潜力。6火龙果整理uml.org.cn细看HTTP与URI火龙果整理uml.org.cnHTTP:信封里的文档HTTP协议的形象理解:信封格式有严格标准,不关心里面内容。客户端服务器响应请求火龙果整理uml.org.cnHTTP请求方法(method):表示客户端希望服务器如何处理该信封。有GET、POST、PUT、DELETE、HEAD、OPTION、TRACE和CONNECT八个方法。路径(path):请求链接里主机名后面部分,即信封上的地址。请求报头(requestheaders):一组起元数据作用的键值对,类似信封上贴的标签信息。HTTP除定义了一套标准报头外,程序也可以自己定义报头。实体主体(entity-body):也称作文档或表示,即信封里的文档。一般情况下,请求实体主体可为空。9火龙果整理uml.org.cnHTTP响应响应代码(responsecode):通知客户端请求成功或失败,以及如何处理信封里的内容。响应报头(responseheader):类似请求报头。实体主体(entity-body):同样是放在信封里的文档,但绝大多数情况它不会为空。10火龙果整理uml.org.cnHTTP报头标准报头•Host、User-Agent、Accept、Allow、Accept-Charset、Accept-Encoding、Accept-Language、Range、If-Modified-Since、If-None-Match、Authorization•Content-Type、Content-Length、Content-Range、Location、Content-MD5、Content-Location、Content-Encoding、Content-Language、Accept-Ranges、Expires、Last-Modified、ETag、•Date、Cache-Control非标准报头•Cookie、Set-Cookie、X-WSSE自定义报头•不重新发明已存在的报头•不将应该放在实体主体里的信息放进报头•命名遵循惯例,名称以“X-”开头11火龙果整理uml.org.cnHTTP响应代码状态码(3位数字)分类•1xx:通知——仅在与HTTP服务器沟通时使用•2xx:成功——成功收到、理解和接受动作•200(“OK”)、201(“Created”)、204(“NoContent”)•3xx:重定向——为完成请求,必须进一步采取措施•301(“MovedPermanently”)、303(“SeeOther”)、304(“NotModified”)、307(“TemporaryRedirect”)•4xx:客户端错误——请求包含错误的语法或不能完成•400(“BadRequest”)、401(“Unauthorized”)、403(“Forbidden”)、404(“NotFound”)、405(“MethodNotAllowed”)、406(“NotAcceptable”)、409(“Conflict”)、410(“Gone”)•5xx:服务器端错误——服务器不能完成明显合理的请求•500(“InternalServerError”)、503(“ServiceUnavailable”)12火龙果整理uml.org.cnHTTP示例13火龙果整理uml.org.cnURI=URL+URNURI(UniformResourceIdentifier):通用资源标识符,它被设计充当可用位置和持久名称。URL提供资源定位方法,依赖于命名和位置机制。URN(UniformResourceName)需要是全球惟一的,并且在资源不存在或不再可用时依然保持不变。URI可为定位器、名称,或两者兼具,取决于标识符分配中的持久性和命名机构对其关注程度。不论在哪里都可以对URI作出一致的解释,通常没有必要刻意区分它们。14火龙果整理uml.org.cn解析URI语法规则:大致指向一个层次空间,协议是树根,从左往右每部分是前部分的分支。例:=张三#photo方案域名路径查询片段路径:并非一定要采用层次结构,可根据应用程序模型定制路径结构。例:某标记系统用户名标记查询:URI中非层次部分,通常后台数据库应用程序要使用它。片段:用于标示下一级资源,只在客户端有效。浏览器HTML中常对应页面锚点。15火龙果整理uml.org.cnURI空间的实现及维护“优秀的URI不会改变”——TimBerners-Lee最大限度地延长URI生命周期的保障:1.独立于技术2.层次结构和集合3.末尾的斜杠和位置无关最大限度降低修改URI造成的负面影响:1.永久性重定向资源2.暂时重定向资源3.不应该使用的重定向方法4.服务器端重定向16火龙果整理uml.org.cnREST抽象概念与设计原则火龙果整理uml.org.cn资源URI规范(RFC2396)指出:“资源可以是任何有标示的东西”;“并非所有的资源都是通过网络能够获取的”。任何事物,只要有被引用的必要,就是一个资源(resource)。它可以是一个实物,也可以是一个抽象的概念。通常一个资源是某个可以存放在计算机上并体现为比特流的事物。在Web中,可以这样认为——资源是URI标示的东西。18火龙果整理uml.org.cn表示资源和表示不是一码事。Web上获取的不是资源,而是资源的表示。对于给定的资源,可以有很多不同的表示。19表示表示表示HTMLXMLFlashText资源表示标识符(URI)火龙果整理uml.org.cn状态在客户-服务端模式下,让客户端维护应用状态,并确保服务端向服务器发出的请求都包含理解请求所需的全部信息,而服务器不应该维护该状态。REST式解决方案是使用URI。每个概念上独立的资源都可使用单个URI,不希望通过Cookie或隐藏在有效负载的参数来提供额外信息。例:查看john在某网站2008-10-10的所有文档资料火龙果整理uml.org.cnREST设计准则网络上的所有事物都被抽象为资源每个资源对应一个唯一的资源标识URI通过HTTP协议方法作连接器对资源进行操作对资源的任何操作不改变资源标识URI所有的服务器操作都是无状态的21火龙果整理uml.org.cn违背REST的恶果服务端必须维持状态难以对URI进行缓存应用部署难以水平扩展存在安全隐患数据与表象混杂无法准确表达与理解请求含义对不同客户端要分代码处理URI难以持久化暴露技术实现且易变更URI代码方法入侵URI不利于搜索引擎22火龙果整理uml.org.cnWeb架构的现状火龙果整理uml.org.cn相互竞争的Web服务架构REST式面向资源的架构具备Web特征的服务:静态网站、许多未采用SOAP的只读Web服务、许多只读型Web应用等PRC式架构所有采用XML-RPC遗留协议的服务,几乎所有的SOAP服务REST-RPC混合架构大部分Web应用,大量采用MVC模式的Web应用24火龙果整理uml.org.cnXML-RPC例子POST/rpcHTTP/1.1...?xmlversion=1.0?methodCallmethodNamegetApp/methodNameparamsparamvaluestring213/string/value/paramparams/methodCall25火龙果整理uml.org.cnSOAP-RPC例子POSTsearch/beta2HTTP/1.1Host:api.google.comContent-Type:application/soap+xmlSOAPAction:urn:GoogleSearchAction?xmlversion=1.0encoding=UTF-8?soap:Envelopexmlns:soap=:Bodygs:doGoogleSearchxmlns:gs=urn:GoogleSearchqREST/q…/gs:doGoogleSearch/soup:Body/soap:Envelope26火龙果整理uml.org.cnREST-RPC例子GETservices/rest?api_key=xxx&method=flickr.photos.search&tags=penguinHTTP/1.1Host:…GETmember/corporation/crpHome!ListByUserId.jspaHTTP/1.1Host:member.alisoft.com…27火龙果整理uml.org.cn差别的形成尽管HTTP是共用的,但在两个问题上的做法不同Q1:客户端如何传递自己的意图到服务端,让它知道请求到底是获取、创建、修改或是删除数据?Q2:服务端如何知晓具体操作那些数据?根源:对Web的理解的不同,实际应当与Web的理念保持一致28火龙果整理uml.org.cn方法信息(MethodInfomation)方式一:使用HTTP方法方式二:放到请求URI路径里方式三:放入实体主体或HTTP报头29火龙果整理uml.org.cn作用域信息(ScopingInfomation)方式一:放到请求URI路径里方式二:放入实体