- 浏览: 253489 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
fjdingsd:
目前基于REST的Java框架不包括Jersey吗
Hello REST!!! -
qq690388648:
不错,说的很好!
Restlet实战(十四)如何在Restlet得到Servlet request和Session -
zhuanbiandejijie:
唉... 你09年就接触Restlet了.15年我才开始看Re ...
Hello REST!!! -
zmjiao:
client.options( 这个是那个包下面的? rest ...
Restlet实战(十八)Restlet如何产生WADL -
shihezichen:
对于最近很多人都在讨论的, 使用REST时就不应该掺杂事务的看 ...
Restlet实战(二十六)事务 (Transaction)
现在究竟REST是否需要WADL这种东西,有很多争论,有人说不需要,给出的理由是,如果客户端根据WADL来编写了客户端,那将来服务改变了怎么办;有人说需要,但是基于特定的形式,比如APP。众说纷纭吧。
先不管了。看看Restlet里面是如何支持WADL的。Restlet里提供了一组类:WadlComponent, WadlApplication, WadlResource等,如果想了解的更多,可以到org/restlet/ext/wadl下查看。
转入正题,要想我们的基于Restlet的Web提供Wadl,首先需要改变Resource类,之前每个Resource类都继承于org.restlet.resource.Resource类, 现在要改为使其继承org.restlet.ext.wadl.WadlResource, 而此类中有五个新的方法describeGet, describePut, describePost, describeDelete, describeOptions对应描述GET, PUT, POST, DELETE, OPTIONS。
下面我们在describeGet, describePost, describeDelete添加一些描述信息:
@Override protected void describeGet(MethodInfo info) { info.setIdentifier("customer"); info.setDocumentation("To retrieve details of a specific customer"); RepresentationInfo repInfo = new RepresentationInfo(MediaType.TEXT_XML); repInfo.setXmlElement("customer"); repInfo.setDocumentation("XML representation of the current customer."); info.getResponse().getRepresentations().add(repInfo); FaultInfo faultInfo = new FaultInfo(Status.CLIENT_ERROR_NOT_FOUND, "customer not found"); faultInfo.setIdentifier("customerError"); faultInfo.setMediaType(MediaType.TEXT_HTML); info.getResponse().getFaults().add(faultInfo); }
@Override protected void describePost(MethodInfo info) { info.setDocumentation("Update or create the current customer."); RepresentationInfo repInfo = new RepresentationInfo( MediaType.APPLICATION_WWW_FORM); ParameterInfo param = new ParameterInfo("name", ParameterStyle.PLAIN, "Name of the customer"); repInfo.getParameters().add(param); param = new ParameterInfo("description", ParameterStyle.PLAIN, "Description of the customer"); repInfo.getParameters().add(param); repInfo.getStatuses().add(Status.SUCCESS_OK); repInfo.getStatuses().add(Status.SUCCESS_CREATED); repInfo.setDocumentation("Web form."); info.getRequest().getRepresentations().add(repInfo); }
@Override protected void describeDelete(MethodInfo info) { info.setDocumentation("Delete the current customer."); RepresentationInfo repInfo = new RepresentationInfo(); repInfo.setDocumentation("No representation is returned."); repInfo.getStatuses().add(Status.SUCCESS_NO_CONTENT); info.getResponse().getRepresentations().add(repInfo); }
简要说明一下DescribeGet方法里面的设置:
info.setIdentifier("customer"); 是为Get方法在wadl里设定一个唯一id值
info.setDocumentation()是设定文档的名称(描述)
而
RepresentationInfo repInfo = new RepresentationInfo(MediaType.TEXT_XML); repInfo.setXmlElement("customer"); repInfo.setDocumentation("XML representation of the current customer."); info.getResponse().getRepresentations().add(repInfo);
是设定表述的相关内容,如返回的表述的类型是基于XML的形式。
另外可以定义出错信息,通过FaultInfo:
FaultInfo faultInfo = new FaultInfo(Status.CLIENT_ERROR_NOT_FOUND, "Customer not found"); faultInfo.setIdentifier("customerError"); faultInfo.setMediaType(MediaType.TEXT_HTML); info.getResponse().getFaults().add(faultInfo);
接下来,测试一下上述代码,看看最终的Wadl是什么样子:
首先启动服务,然后编写客户端如下:
Reference appUri = new Reference("http://localhost:8080/restlet/resources/customers/1"); // The URI of the resource "list of items". Reference itemsUri = new Reference(appUri, "items"); Client client = new Client(Protocol.HTTP); // Displays the WADL documentation of the application client.options(appUri).getEntity().write(System.out);
如果所有的代码没有问题,则会有Wadl内容输出:
<?xml version="1.0" standalone="yes"?> <?xml-stylesheet type="text/xsl" href="wadl_documentation.xsl"?> <application xmlns="http://research.sun.com/wadl/2006/10"> <resources> <resource path="/customers/1"> <method name="DELETE"> <doc>Delete the current customer.</doc> <request/> <response> <representation status="204"> <doc>No representation is returned.</doc> </representation> </response> </method> <method id="customer" name="GET"> <doc>To retrieve details of a specific customer</doc> <request/> <response> <representation mediaType="text/xml" element="customer"> <doc>XML representation of the current customer.</doc> </representation> <fault id="customerError" mediaType="text/html" status="404"> <doc>customer not found</doc> </fault> </response> </method> <method name="POST"> <doc>Update or create the current customer.</doc> <request> <representation mediaType="application/x-www-form-urlencoded" status="200 201"> <doc>Web form.</doc> <param style="plain" name="name"> <doc>Name of the customer</doc> </param> <param style="plain" name="description"> <doc>Description of the customer</doc> </param> </representation> </request> <response/></method> </resource> </resources> </application>
对照这个输出,然后回头看看我们在CustomerResource里面的描述设定,是不是清楚了很多。
一个在线的分析和描述Wadl的工具网站:http://tomayac.de/rest-describe/latest/RestDescribe.html
发表评论
-
Restlet实战(三十)(完结篇)运行流程之源代码分析(续)
2009-08-24 14:25 4157前面一篇文章分析了servlet里init方法,包括init方 ... -
Restlet实战(二十九)(完结篇)运行流程之源代码分析
2009-08-20 17:32 5309终于到了完结篇,也体 ... -
Restlet实战(二十八)源代码分析之压缩 (Compression)
2009-08-10 15:36 3260上篇文章我给出了如何 ... -
Restlet实战(二十七)压缩 (Compression)
2009-08-05 12:09 7202在进入代码部分之前,还是贴出<<RESTful W ... -
Restlet实战(二十六)事务 (Transaction)
2009-08-02 23:29 5388<<Restful Web Service> ... -
Restlet实战(二十五)缓存 (Cache)
2009-07-31 22:18 3989说明:以下部分文字说明摘自<<Restful We ... -
Restlet实战(二十四)获取参数值(续)
2009-07-31 14:44 10420这个系列之前已经有一篇文章写如何获取参数值,看Restlet实 ... -
欢迎加入Restlet圈子
2009-07-28 22:28 2817如果你进来是因为想看Restlet相关的文章,那么欢迎你加入r ... -
Restlet实战(二十三)实现条件GET (Conditional Get)
2009-07-28 17:47 5046先普及一下什么是条件GET,以下摘自<<Restf ... -
Restlet实战(二十二)仿造PUT和DELETE
2009-07-28 13:17 7186在Restlet实战(七)-提交和处理Web Form 中提到 ... -
Restlet实战(二十一)如何保护确定的资源(续)
2009-07-16 16:18 3999在Restlet实战(十七)如何保护确定的资源 中我给出一个如 ... -
Restlet实战(二十)使用Restlet之SSL
2009-07-15 21:37 3326待写 -
Restlet实战(十九)使用Restlet实现Web Service
2009-07-15 21:34 4350先说明本篇文章要实现的功能,仍然做一些假设,当前系统是基于Re ... -
Restlet实战(十七)如何保护确定的资源
2009-07-11 21:55 3429在面向资源的架构中, ... -
Restlet实战(十六)结合源代码分析及使用Filter
2009-07-11 21:13 5735其实在Web应用中Filter对大家来说一点都不陌生,比如说在 ... -
Restlet实战(十五)如何与表示层交互
2009-07-10 13:51 5371首先还是设定一个应用场景,看看用restlet如何实现。 ... -
Restlet实战(十四)如何在Restlet得到Servlet request和Session
2009-07-09 16:39 11522如果你现在已经有一个web系统,而为了一些需求,你集成了res ... -
Restlet实战(十三)如何在Servlet中呼叫Restlet
2009-07-09 14:47 4524看到这个题目,或许你会问,你之前的很多文章不都是与servle ... -
Restlet实战(十二)获取参数值
2009-07-07 15:06 6949本篇文章将讲解三种不 ... -
Restlet实战(十一)结合源代码修改Restlet-Spring配置文件
2009-07-04 23:56 6168上篇文章结合了Restlet的源码分析了Restlet-spr ...
相关推荐
3. `org.restlet.ext.wadl.jar`:WADL(Web Application Description Language)是一个XML格式,用于描述RESTful服务。此jar包提供了WADL的处理和支持。 4. `org.restlet.ext.rdf.jar`:RDF(Resource Description ...
* Configuration possible via Restlet XML and WADL files * Servlet adapter provided to let you deploy any Restlet application in Servlet compliant containers like Tomcat, when the usage of standalone...
5. **REST工具推荐**:推荐了一些成熟的工具和框架,如Jersey项目及JAX-RS标准,以及WADL(Web Application Description Language,Web应用描述语言)等。 #### 五、Jersey项目与JAX-RS标准 - **JAX-RS**(Java API...
4.9 restlet框架 186 4.10 下一章 191 第5章 web服务安全 193 5.1 web服务安全概述 193 5.2 线路级(wire-level)安全 194 5.3 为rabbitcounter服务添加安全支持 203 5.4 web服务容器管理的安全 212 5.5 ws-security ...
Clients Made Easy with WADL 47 3. What Makes RESTful Services Different?.... . 49 Introducing the Simple Storage Service 49 Object-Oriented Design of S3 50 Resources 52 HTTP Response Codes 54 An...
- **简化客户端开发**: 利用WADL(Web Application Description Language)等工具简化客户端的开发过程。 #### 九、设计面向资源的服务 - **资源设计**: 如何定义和组织资源。 - **命名规则**: 如何创建清晰且有...
hikaku:一个测试REST-API实现是否符合其规范的库
WADL简化客户端的编写.....................47 -------------------------------------------- 第3章:REST式服务有什么特别不同?.........49 介绍Simple.Storage.Service...............49 S3的面向对象设计......