查看: 9057|回复: 5

基于Java的REST服务框架resty介绍

[复制链接]
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
跳转到指定楼层
1#
发表于 2015-1-12 13:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
resty 一款极简的restful轻量级的web框架

拥有jfinal/activejdbc一样的activerecord的简洁设计,使用更简单的restful框架

restful的api设计,是作为restful的服务端最佳选择(使用场景:客户端和服务端解藕,用于对静态的html客户端(mvvm等),ios,andriod等提供服务端的api接口)

一、独有优点:

1.极简的route设计:
  1.   @GET("/users/:name")  在路径中自定义解析的参数 如果有其他符合 也可以用 /users/{name}
  2.   // 参数名就是方法变量名  除路径参数之外的参数也可以放在方法参数里  传递方式 user={json字符串}
  3.   public Map find(String name,User user) {
  4.     // return Lister.of(name);
  5.     return Maper.of("k1", "v1,name:" + name, "k2", "v2");//返回什么数据直接return,完全融入普通方法的方式
  6.   }
复制代码


论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
2#
 楼主| 发表于 2015-1-12 13:09 | 只看该作者
2.极简的activerecord设计,数据操作只需短短的一行,支持批量保存对象
  1.   //批量保存
  2.   User u1 = new User().set("username", "test").set("providername", "test").set("password", "123456");
  3.   User u2 = new User().set("username", "test").set("providername", "test").set("password", "123456");
  4.   User.dao.save(u1,u2);

  5.   //普通保存
  6.   User u = new User().set("username", "test").set("providername", "test").set("password", "123456");
  7.   u.save();

  8.   //更新
  9.   u.update();
  10.   //条件更新
  11.   User.dao.updateBy(where,paras);
  12.   User.dao.updateAll(columns,where,paras);

  13.   //删除
  14.   u.deleted();
  15.   //条件删除
  16.   User.dao.deleteBy(where,paras);
  17.   User.dao.deleteAll();

  18.   //查询
  19.   User.dao.findById(id);
  20.   User.dao.findBy(where,paras);
  21.   User.dao.findAll();

  22.   //分页
  23.   User.dao.paginateBy(pageNumber,pageSize,where,paras);
  24.   User.dao.paginateAll(pageNumber,pageSize);
复制代码

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
3#
 楼主| 发表于 2015-1-12 13:10 | 只看该作者
3.极简的客户端设计,支持各种请求,文件上传和文件下载(支持断点续传)
  1.   Client client=null;//创建客户端对象
  2.   //启动resty-example项目,即可测试客户端
  3.   String apiUrl = "http://localhost:8081/api/v1.0";
  4.   //如果不需要 使用账号登陆
  5.   //client = new Client(apiUrl);
  6.   //如果有账号权限限制  需要登陆
  7.   client = new Client(apiUrl, "/tests/login", "u", "123");

  8.   //该请求必须  登陆之后才能访问  未登录时返回 401  未认证
  9.   ClientRequest authRequest = new ClientRequest("/users", HttpMethod.GET);
  10.   ResponseData authResult = client.build(authRequest).ask();
  11.   System.out.println(authResult.getData());

  12.   //get
  13.   ClientRequest getRequest = new ClientRequest("/tests", HttpMethod.GET);
  14.   ResponseData getResult = client.build(getRequest).ask();
  15.   System.out.println(getResult.getData());

  16.   //post
  17.   ClientRequest postRequest = new ClientRequest("/tests", HttpMethod.POST);
  18.   postRequest.addParameter("test", Jsoner.toJSONString(Maper.of("a", "谔谔")));
  19.   ResponseData postResult = client.build(postRequest).ask();
  20.   System.out.println(postResult.getData());

  21.   //put
  22.   ClientRequest putRequest = new ClientRequest("/tests/x", HttpMethod.PUT);
  23.   ResponseData putResult = client.build(putRequest).ask();
  24.   System.out.println(putResult.getData());


  25.   //delete
  26.   ClientRequest deleteRequest = new ClientRequest("/tests/a", HttpMethod.DELETE);
  27.   ResponseData deleteResult = client.build(deleteRequest).ask();
  28.   System.out.println(deleteResult.getData());


  29.   //upload
  30.   ClientRequest uploadRequest = new ClientRequest("/tests/resty", HttpMethod.POST);
  31.   uploadRequest.addUploadFiles("resty", ClientTest.class.getResource("/resty.jar").getFile());
  32.   uploadRequest.addParameter("des", "test file  paras  测试笔");
  33.   ResponseData uploadResult = client.build(uploadRequest).ask();
  34.   System.out.println(uploadResult.getData());


  35.   //download  支持断点续传
  36.   ClientRequest downloadRequest = new ClientRequest("/tests/file", HttpMethod.GET);
  37.   downloadRequest.setDownloadFile(ClientTest.class.getResource("/resty.jar").getFile().replace(".jar", "x.jar"));
  38.   ResponseData downloadResult = client.build(downloadRequest).ask();
  39.   System.out.println(downloadResult.getData());
复制代码

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
4#
 楼主| 发表于 2015-1-12 13:10 | 只看该作者
4.支持多数据源和嵌套事务(使用场景:需要访问多个数据库的应用,或者作为公司内部的数据中间件向客户端提供数据访问api等)
  1.   // 在resource里使用事务,也就是controller里,rest的世界认为所以的请求都表示资源,所以这儿叫resource
  2.   @GET("/users")
  3.   @Transaction(name = {DS.DEFAULT_DS_NAME, "demo"}) //多数据源的事务,如果你只有一个数据库  直接@Transaction 不需要参数
  4.   public User transaction() {
  5.   //TODO 用model执行数据库的操作  只要有操作抛出异常  两个数据源 都会回滚  虽然不是分布式事务  也能保证代码块的数据执行安全
  6.   }

  7.   // 如果你需要在service里实现事务,通过java动态代理(必须使用接口,jdk设计就是这样)
  8.   public interface UserService {
  9.     @Transaction(name = {DS.DEFAULT_DS_NAME, "demo"})//service里添加多数据源的事务,如果你只有一个数据库  直接@Transaction 不需要参数
  10.     public User save(User u);
  11.   }
  12.   // 在resource里使用service层的 事务
  13.   // @Transaction(name = {DS.DEFAULT_DS_NAME, "demo"})的注解需要写在service的接口上
  14.   // 注意java的自动代理必须存在接口
  15.   // TransactionAspect 是事务切面 ,你也可以实现自己的切面比如日志的Aspect,实现Aspect接口
  16.   // 再private UserService userService = AspectFactory.newInstance(new UserServiceImpl(), new TransactionAspect(),new LogAspect());
  17.   private UserService userService = AspectFactory.newInstance(new UserServiceImpl(), new TransactionAspect());
复制代码

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
5#
 楼主| 发表于 2015-1-12 13:10 | 只看该作者
5.极简的权限设计,你只需要实现一个简单接口和添加一个拦截器,即可实现基于url的权限设计
  1.   public void configInterceptor(InterceptorLoader interceptorLoader) {
  2.     //权限拦截器 放在第一位 第一时间判断 避免执行不必要的代码
  3.     interceptorLoader.add(new SecurityInterceptor(new MyAuthenticateService()));
  4.   }

  5.   //实现接口
  6.   public class MyAuthenticateService implements AuthenticateService {
  7.     //登陆时 通过name获取用户的密码和权限信息
  8.     public Principal findByName(String name) {
  9.       DefaultPasswordService defaultPasswordService = new DefaultPasswordService();

  10.       Principal principal = new Principal(name, defaultPasswordService.hash("123"), new HashSet<String>() {{
  11.         add("api");
  12.       }});
  13.       return principal;
  14.     }
  15.     //基础的权限总表  所以的url权限都放在这儿  你可以通过 文件或者数据库或者直接代码 来设置所有权限
  16.     public Set<Permission> loadAllPermissions() {
  17.       Set<Permission> permissions = new HashSet<Permission>();
  18.       permissions.add(new Permission("GET", "/api/transactions**", "api"));
  19.       return permissions;
  20.     }
  21.   }
复制代码

使用道具 举报

回复
论坛徽章:
0
6#
发表于 2018-8-8 17:16 | 只看该作者
(1)通过配置应用程序调用rest服务 年编写java类型的应用程序,在java程序中调用rest服务 (2)以web服务的形式调用rest服务 此种方式对rest服务的声明有一定要求,声明方式如下所示,仅供参考: @Mapping("/rest/getUserInfo" public Renderer cnkeet() throws Exception { ActionContext ac=ActionContext.getActionContext(); HttpServletRequesthrq=ac.getHttpServletRequest();Stringid=hrq.getParameter(“id”); JSONObject object=new JSONObject(); object.put(“id”, id); return new PlainRenderer(object.toString()); } 此种声明方式需要通过request获取参数值】 注:如果rest服务声明为如下形式 @Mapping("/rest/getUserInfo/$1/$2" public Renderer getUserInfo(String id) throws Exception { } 工作流在调用rest服务时,url为http://iport/context/rest/getUserInfo?t=""&n="" 。与rest声明不符,调用失败, 导致调用rest服务失败。具体可参考东软官网,https://platform.neusoft.com/

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表