【虎.无名】自定义Java的REST行为分发器

【虎.无名】在Restlet和Rails中,资源所支持的Action操作是不一致的。Restlet支持4个操作,而Rails支持的则多了index等几个。前者与某个具体id资源对应,后者与一类资源对应。后者更简洁一些
1,GET /users 列表所有用户
2,POST /users 创建新用户(此时id尚未确定)
3,GET /users/{id} 显示(与id对应的)某用户
4,PUT /users/{id} 更新(与id对应的)某用户(不存在,则创建,与“2,POST”类似)
5,POST /users/{id} (扩展定义,与“4,PUT”等效,针对不支持PUT的服务器)
6,DELETE /users/{id} 删除(与id对应的)某用户
7,GET /users/{id}/orders 列表(与id对应的)某用户的所有订单
8,POST /users/{id}/orders 创建(与id对应的)某用户的新订单
9,GET /users/{id}/orders/{orderid} 显示(与id对应的)某用户的某个订单
【虎.无名】我的设想是参考Rails机制,定义自己的路由映射机制,自定义Servlet来解析如下5个操作。(注意:里面doList没有考虑根据某些条件来查询,因而没有req参数。只有doUpdate需要req参数)

protected abstract void doList(HttpServletResponse res, Map uriAttr) throws IOException,ServletException;
protected abstract void doCreate(HttpServletResponse res, Map uriAttr) throws IOException,ServletException;
protected abstract void doShow(HttpServletResponse res, Map uriAttr, String id) throws IOException,ServletException;
protected abstract void doDelete(HttpServletResponse res, Map uriAttr, String id) throws IOException,ServletException;
protected abstract void doUpdate(HttpServletResponse res, Map uriAttr, String id, HttpServletRequest req) throws IOException,ServletException;

 //REST行为分发器

public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
   _log.debug("# service(HttpServletRequest)...", req.getRemoteAddr());
   String method = req.getMethod();
   String id = this.getId();
   if (null==id) {
    if(method.equalsIgnoreCase("GET")) {//1,GET /users 列表所有用户
     this.doList(res, _uriAttr);//缺省(无法定义参数,可以考虑在body中定义参数,但这样破坏了资源的一致性。)
    }else if (method.equalsIgnoreCase("POST")) {//2,POST /users 创建新用户(此时id尚未确定)
     this.doCreate(res, _uriAttr);//创建,此时id尚未确定
    }else {
     res.sendError(HttpConst.CLIENT_ERROR_Method_Not_Allowed);
    }   
   }else {
    if (method.equalsIgnoreCase("GET")) {//3,GET /users/{id} 显示(与id对应的)某用户
     this.doShow(res, _uriAttr, id);
    }else if (method.equalsIgnoreCase("PUT")) {//4,PUT /users/{id} 更新(与id对应的)某用户(不存在,则创建,与“2,POST”类似)
     this.doUpdate(res, _uriAttr, id, req);
    }else if (method.equalsIgnoreCase("POST")) {//5,POST /users/{id} (扩展定义,与“4,PUT”等效,针对不支持PUT的服务器)
     this.doUpdate(res, _uriAttr, id, req);//此时id已经确定,针对此URI可替代PUT方法
    }else if (method.equalsIgnoreCase("DELETE")) {//6,DELETE /users/{id} 删除(与id对应的)某用户
     this.doDelete(res, _uriAttr, id);
    }else { //缺省行为!
     res.sendError(HttpConst.CLIENT_ERROR_Method_Not_Allowed);
    }
   }
}

 (待续)
原贴http://hi.baidu.com/zeorliu/blog/item/ca3a3997ab79ac6b55fb96c2.html 2008-09-08 17:59【虎.无名】自定义Java的REST行为分发器
参考
http://hi.baidu.com/821115/blog/item/e6df10f03a9efdada50f520f.html 传统的Java Web MVC框架距离REST有多远
【虎.无名】(评论)Restlet作者认为servlet是过度设计,因而重新定义了一套API,后来我发现,restlet本身也似乎过度设计了,连MediaType都使用了特定的类来表示,请求也没有获取charset的方法,getText()获取没有字符集参数,因而支持中文很困难。JRest4Guice则是一个国产开源项目(项目地址: http://code.google.com/p/jrest4guice/ 这个项目借鉴了http://www.iteye.com/topic/170289 的一些思想和代码),使用Guice作为容器(因而要求jdk5环境),基于Servlet来实现REST开发。不过作者最近半年也没怎么更新了。其中路由映射机制倒是给我了一些参考。不过,我感觉,不应该根据http的method来分发请求,而应根据REST特点行为来分发请求
http://cnoss.iteye.com/blog/176755 2008-03-27 向大家推荐一个轻量级的java rest 框架 JRest4Guice
http://www.iteye.com/topic/201103 一个Java的Restful服务框架(JRest4Guice),支持JPA、JAAS、分布式资源对象
http://www.iteye.com/topic/170289 2008-03-11 超轻量的REST“框架”:目前唯一的功能就是实现REST风格的URL映射以及不同的HTTP方法(GET,POST,PUT和DELETE)对资源类的方法的映射,框架的使用很简单。 【虎.无名:是JRest4Guice的最初原型】
http://www.ibm.com/developerworks/cn/xml/x-restfulsoa/index.html 2008年3月06日:使用 XML 实现 REST 式的 SOA,简化面向服务和XML序列化 【虎.无名:这是上面超轻量的REST“框架”的灵感来源】
http://www.iteye.com/topic/85928 2007-06-02 (dlee)Java REST框架一览
http://www.iteye.com/topic/70113 2007-04-11 关于REST的一点想法,欢迎大家讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值