您好,欢迎访问三七文档
REST分享交流由来•REST(Representationalstatetransfer)表象化状态转变或者表述性状态转移•RoyFielding在2000年他的博士论文中提出来的一种软件架构风格。到底是什么•REST是一种设计风格。它不是一种标准,也不是一种软件,而是一种思想。•REST通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准。宗旨•从资源的角度来观察整个网络网络上的所有事物都是资源,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表述。•REST架构风格以资源为核心进行设计•REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。架构约束•客户端和服务器结构•连接协议具有无状态性•能够利用Cache机制增进性能•统一接口•层次化的系统•CodeOnDemand按需代码一个简单扼要的定义•REST定义了应该如何正确地使用(这和大多数人的实际使用方式有很大不同)Web标准,例如HTTP和URI。如果你在设计应用程序时能坚持REST原则,那就预示着你将会得到一个使用了优质Web架构的系统。----------StefanTilkov什么叫REST?•要理解RESTful架构,最好的方法就是去理解RepresentationalStateTransfer这个词组到底是什么意思,它的每一个词代表了什么涵义。•资源(Resources)•表现层(Representation)•状态转化(StateTransfer)资源(Resources)•REST的名称表现层状态转化中,省略了主语。表现层其实指的是资源(Resources)的表现层。•所谓资源,就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。•所谓上网,就是与互联网上一系列的资源互动,调用它的URI。表现层(Representation)•资源是一种信息实体,它可以有多种外在表现形式。我们把资源具体呈现出来的形式,叫做它的表现层(Representation)。•比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。•URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的.html后缀名是不必要的,因为这个后缀名表示格式,属于表现层范畴,而URI应该只代表资源的位置。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对表现层的描述。状态转化(StateTransfer)•访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。•互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生状态转化(StateTransfer)。而这种转化是建立在表现层之上的,所以就是表现层状态转化。•客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。•综合上面的解释,我们总结一下什么是RESTful架构:(1)每一个URI代表一种资源;(2)客户端和服务器之间,传递这种资源的某种表现层;(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现表现层状态转化。例子•最常见的一种设计错误,就是URI包含动词。因为资源表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。•举例来说,某个URI是/posts/show/1,其中show是动词,这个URI就设计错了,正确的写法应该是/posts/1,然后用GET方法表示show。•如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源。比如网上汇款,从账户1向账户2汇款500元,错误的URI是:POST/accounts/1/transfer/500/to/2•正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是一种服务:POST/transactionHTTP/1.1Host:127.0.0.1from=1&to=2&amount=500.00例子•另一个设计误区,就是在URI中加入版本号:://://•因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分(参见VersioningRESTServices):Accept:vnd.example-com.foo+json;version=1.0Accept:vnd.example-com.foo+json;version=1.1Accept:vnd.example-com.foo+json;version=2.0关键原则•为所有资源定义ID•将所有资源链接在一起•使用标准方法•资源多重表述•无状态通信为所有资源定义ID•资源是暴露给外界的接口,资源由URI标识,URI是资源的名词,也是资源在Web上的地址,对资源感兴趣的客户可以通过URI与资源交互。•在REST的定义中,一个Web应用总是使用固定的URI向外部世界呈现(或者说暴露)一个资源。•URI是英文UniformResourceIdentifier的缩写,中文翻译“通用资源标志符”。•“通用资源标志符”是指唯一标识一个资源(xhtml文件、图片、css样式表)的字符串。•通过REST架构,Web应用程序可以用一致的接口(URI)暴露资源给外部世界,并提供对资源的操作服务。这对于以资源为中心的Web应用来说非常重要。例如照片共享网站、用户社区等。将所有资源链接在一起•任何可能的情况下,使用链接指引可以被标识的事物(资源)•例子newsself==使用标准方法•如果你在公共汽车上看到一个URI,你可以将它输入浏览器的地址栏中并回车——但是你的浏览器如何知道需要对这个URI做些什么呢?•它知道如何去处理URI的原因在于所有的资源都支持同样的接口,一套同样的方法(只要你乐意,也可以称为操作)集合。在HTTP中这被叫做动词(verb),除了两个大家熟知的(GET和POST)之外,标准方法集合中还包含PUT、DELETE、HEAD和OPTIONS。•RESTfulHTTP方案中的所有资源都继承自类似于这样的一个类:•classResource•{Resource(URIu);•Responseget();•Responsepost(Requestr);•Responseput(Requestr);•Responsedelete();}资源多重表述•什么是资源表述?它是一段对于资源在某一个特定时刻的状态描述,资源表述有多种格式,最常见的是HTML/XML/JSON纯文本。无状态通信•服务器端不能保持除了单次请求之外的,任何与其通信的客户端的通信状态。•这样做的最直接的理由就是可伸缩性——如果服务器需要保持客户端状态,那么大量的客户端交互会严重影响服务器的内存可用空间。目前的restful框架•目前宣称支持REST风格webservice的Java框架包括以下这些:•Restlet•Jersey•RESTEasy(JBoss的),•CXF•Spring3.0也支持REST了,•还有国人做的一个轻量框架JRest4Guice•Php和pythonREST优势•使用REST的最佳的场景是对外提供公开的服务,也就是所谓的OpenAPI,也有的人认为REST更适合资源导向的网站,像youtube这样的网站。•REST的真正价值在于WebServices,而不是通过浏览器操作的应用程序。Restlet•@Path(/job)•publicclassJobResourceextendsBaseResource{•@Requirement(role=JobService.class,hint=jobService)•privateJobServicejobService;•@Put(form)•publicRepresentationputJob(Representationentity){•try{•Formdata=newForm(entity);•StringjobId=notEmpty(data,job,Chooseonejob);•return$(jobService.start(jobService.get(getUserId(),•PlayerEntity.class),jobId));•}catch(Exceptione){•return$(Utils.trace(e.getMessage(),Result.fail().toJSON()));•}•}•@Post(form)•publicRepresentationpostJob(Representationentity){•try{•return$(jobService.end(jobService.get(getUserId(),•PlayerEntity.class)));•}catch(Exceptione){•return$(Utils.trace(e.getMessage(),Result.fail().toJSON()));•}•}•}•/**•*ForEquipmentpanel•*/•@Path(/equip)•publicclassEquipmentResourceextendsBaseResource{•@Requirement(role=ApplicationListener.class,hint=bagService)•BagServicebagService;•@Requirement(role=ArtifactService.class,hint=artifactService)•ArtifactServiceartifactService;•@Get(json)•publicRepresentationshowEquipments(){•returnbagService.showEquipments(getUserId());•}•/***•*ship/unshiptheartifact•*@paramrep•*@return•*/•@Path(/{sid})•@Put(form)•publicRepresentationloadEquipment(Representationrep){•Stringsid=getAttribute(sid);•//Formform=newForm(rep);•//Stringoldseqids=form.getFirstValue(old);•returnartifactService.loadArtifact(StringUtils.isEmpty(sid)?null:Long.valueOf(sid),getUserId(),null);•}•@Pa
本文标题:RESTful介绍
链接地址:https://www.777doc.com/doc-7119450 .html