Restlet2.0初尝试
今天一直在研究Restlet的API,大约应该是在2007年起,1.0版就已经问世了。但是由于这个概念在当时还是比较新的,所以1.0版本的普及率特别是在国内的普及率还是很低的。百度一下就会发现研究的人的确不多。现在RESTful的概念是越吵越热,且不说它到底好坏与否,但是引起这么多人的关注,就说明了它有其出色的地方。
在网站上看到的Stable的版本是1.6,于是保守地先从这个版本试起,结果发现无论如何添加Connector,都会报找不到Protocol的错,恰好这时James过来看看我,于是在他的建议之下,尝试了2.0m5版本。至少在最简单的程序部分,能够很正常的运行。
下面把一些很简单的步骤作个罗列:
在我看来,完成一个全部由Restlet构造的程序,一共需要四个部分。首先便是资源文件,对于REST概念比较熟悉的同学都应该明白,Resource在REST中是根本中的根本。于是,我们首先定义一个十分简单的Resource,为了简单起见,我们只给它附加两个功能,GET和POST。其中GET方法,很简单的返回一个String,POST方法是将得到的两个数进行相加返回结果字符串。
public class TestResource extends ServerResource{
@Get
public String getResultGet(){
return "This is my test!";
}
@Post
public String getResultPost(Representation entity){
Form form = new Form(entity);
String first = form.getFirstValue("first");
String second = form.getFirstValue("second");
int a = Integer.parseInt(first);
int b = Integer.parseInt(second);
return "The result of "+a+"+"+b+"is "+(a+b);
}
}
在这一步结束之后,我们需要把资源放到一给应用(Application)中去,同时要提供访问它的路径。我个人心目中就把这个部分成为RouterPath,因为这两个单词也是这个文件中最多见的。
public class RouterPath extends Application{
@Override
public Restlet createInboundRoot() {
// TODO Auto-generated method stub
Router router = new Router(getContext());
router.attach("/greeting",TestResource.class);
return router;
}
}
在这一给类中,它继承来Application这个类,目的就可以看成是提供了一个程序环境,在这个大的环境之下,你输入的方法,就将被引导到某个类之中去。比如在这里,所有的以greeting结尾的请求,都会被引导到我们刚才所创建的类里面去。
有来这样两样以后,我们只需要启动这个资源让它开始服务就可以了。我把这个类命名为StartResource类。
public class StartResource {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// Create a new Component.
Component component = new Component();
// Add a new HTTP server listening on port 8182.
component.getServers().add(Protocol.HTTP, 8182);
// Attach the sample application.
component.getDefaultHost().attach(new RouterPath());
// Start the component.
component.start();
}catch (Exception e) {
// Something is wrong.
e.printStackTrace();
}
}
}
我们可以很清楚的看到,这个类启动来在端口8182上的HTTP协议,然后将前面的Application附加在来这个端口上。然后服务就开始启动,等待他人的使用了。
现在我们就可以直接在浏览器中输入这个URL,来调用GET方法了。在这里,我们输入http://localhost:8182/greeting,屏幕上就出现来This is my test!字样。当然浏览器是不支持POST,PUT和DELETE直接在地址栏中的,我们可以用一个简单的JSP界面做一给POST框体,也可以像如下的类用Restlet提供的Client来完成请求。
public class Client {
public static void main(String[] args) {
int a=4;
int b=9;
ClientResource client = new ClientResource("http://localhost:8182/greeting");
try {
System.out.println(client.get().getText());
Form form = new Form();
form.add("first", a+"");
form.add("second",b+"");
System.out.println(client.post(form.getWebRepresentation()).getText());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
很容易看到,GET方法是可以直接用client得到的,而POST方法需要传入一个参数,也就是Resource端所需要的参数。用类似的办法,我们同样可以完成PUT和DELETE。
以上的这个例子实际上非常基础,但是至少展现来Restlet的一些特点,首先它是一个很完善的既支持客户端又支持服务端的API;其次它的结构也十分清晰,只要很好的划分了不同的请求,就能很好地看清楚之间的逻辑;最后就是API的封装还是很简洁的,尤其是在客户端调用这一块。
明天开始继续深入研究,更多的Tutorial可以参见http://www.restlet.org/documentation/2.0/tutorial
This entry was posted on Wednesday, November 4th, 2009 at 5:29 pm and is filed under REST . You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.



