疯狂Activiti6.0连载(21)Activiti的Web Service


声明:本文转载自https://my.oschina.net/JavaLaw/blog/1581902,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

本文节选自《疯狂工作流讲义(第2版)》

疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397

工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577

Activiti的Web Service

使用Restlet编写客户端

        目前支持REST风格Web Service的框架有很多,本书将以CXF、Restlet、HttpClinet为例子,讲述如何调用REST的Web Service。Restlet是一个轻量级的REST框架,在Activiti5.0版本时使用该框架发布Web Service,本小节将编写一个Restlet客户端,调用17.2.2章节发布的服务。

        代码清单17-4:codes\17\restlet-client\src\org\crazyit\restlet\Client.java

        ClientResource client = new ClientResource(                 "http://localhost:8080/test-web/person/1");             // 调用get方法,由于服务器发布的是GET         Representation response = client.get(MediaType.APPLICATION_JSON);         // 创建JacksonRepresentation实例,将响应转换为Map         JacksonRepresentation jr = new JacksonRepresentation(response, HashMap.class);         // 获取转换后的Map对象         Map result = (HashMap)jr.getObject();         // 输出结果         System.out.println(result.get("name")); 

        在代码清单17-4中,根据发布的URI创建一个ClientResource的实例,然后调用get方法,服务端发布的是HTTP的GET方法,因此需要使用get,ClientResource还提供了delete、post等方法,以便可以调用其他HTTP方法,当前Restlet支持使用HTTP的GET、POST、DELETE和PUT方法。调用Web Service后,返回Representation实例,最后通过JacksonRepresentation对象将其转换为Map,运行代码清单17-4后可看到输出结果。

使用CXF编写客户端

        CXF是目前一个较为流行的服务框架,是Apache下的一个开源项目。使用CXF可以发布和调用各种协议的服务,包括SOAP协议、XML/HTTP等,当前CXF已经对REST风格的Web Service提供支持,可以发布REST的Web Service,也可以使用CXF的API来调用Web Service。由于CXF可以与Spring进行整合使用并且配置简单,因此得到许多开发者的青睐,而笔者以往所在公司的大部分项目,均使用CXF来发布和调用Web Service,本章所使用的CXF版本为3.1.10。

        同样地,以17.2.2发布的Web Service为基础,编写CXF客户端请求该服务,如代码清单17-5所示。

        代码清单17-5:codes\17\cxf-client\src\org\crazyit\activiti\CXFClient.java

        // 创建WebClient          WebClient client = WebClient                 .create("http://localhost:8080/test-web/person/1");         // 获取响应         Response response = client.get();         // 获取响应内容         InputStream ent = (InputStream) response.getEntity();         String content = IOUtils.readStringFromStream(ent);         // 输出字符串         System.out.println(content); 

        主要使用WebClient类访问Web Service,获取响应后再读取输入流获取响应的JSON字符串。

使用HttpClient编写客户端

        HttpClient是Apache提供的一个HTTP工具包,使用HttpClient可以通过编码的方式,发送HTTP请求来访问网络上的资源。REST风格的Web Service完全基于HTTP协议,因此可以使用类似HttpClient这些工具来发送HTTP请求,调用REST的Web Service。本书所使用的HttpClient版本为4.5.3。以17.2.2发布的Web Service为基础,编写HttpClient请求该服务,如代码清单17-6所示。

        代码清单17-6:codes\17\httpclient-test\src\org\crazyit\activiti\TestHttpClient.java

        // 创建默认的HttpClient         CloseableHttpClient httpclient = HttpClients.createDefault();         // 调用 GET 方法请求服务         HttpGet httpget = new HttpGet("http://localhost:8080/test-web/person/1");         // 获取响应         HttpResponse response = httpclient.execute(httpget);         // 根据 响应解析出字符串         System.out.println(EntityUtils.toString(response.getEntity())); 

部署Activiti的Web Service

        Activiti的Web Service以一个Web项目为载体,下载Activiti6.0版本后,可以在activiti-6.0.0\wars目录找到activiti-rest.war,将该war包复制到Tomcat的webapps\activiti-rest目录下并解压,就完成了Activiti的Web Service部署。解压后文件结构如图17-4所示。

图17-4 文件结构

        由于activit-rest默认情况下是连接h2数据库,本书的全部案例均使用MySQL数据库,因此还要修改activiti-rest下的配置文件。修改 activiti-rest/WEB-INF/classes/db.properties文件,内容如代码清单17-7所示。

        代码清单17-7:codes\17\activiti-rest\WEB-INF\classes\db.properties

# 默认配置 # jdbc.url=jdbc\:h2\:tcp\://localhost/activiti # db=h2 # jdbc.username=sa # jdbc.driver=org.h2.Driver # jdbc.password=  # MySQL配置 jdbc.url=jdbc:mysql://localhost:3306/act db=MySQL jdbc.username=root jdbc.driver=com.mysql.jdbc.Driver jdbc.password=123456 

        配置文件db.properties主要用来配置Activiti的数据源属性,在默认情况下,activiti-rest中并没有MySQL的JDBC连接驱动,因此还要将MySQL驱动包放到activiti-rest/WEB-INF/lib目录下。完成这些操作后,就可以启动Tomcat,启动完成后,使用浏览器访问以下路径:http://localhost:8080/activiti-rest/service/management/properties,浏览器(笔者使用Chrome浏览器)提示“Authentication is required”,由于几乎全部的Activiti Web Service都需要经过权限验证,以上的测试路径就是其中一个资源地址,看到权限验证的提示后,就证明已成功部署。

        针对MySQL的activiti-rest,放在本书的代码目录中,路径为:codes\17\activiti-rest,读者可直接将该目录复制到tomcat的webapps下,注意需要修改数据库配置。

接口访问权限

        访问activiti-rest的接口,需要验证用户名与密码,用户名和密码保存在ACT_ID_USER表中,用户名为ID_字段,密码为PWD_字段。在访问接口时,activiti-rest模块,会调用IdentityService的checkPassword方法进行权限验证。

访问Activiti接口

        在前面章节,编写了三个客户端访问REST的服务,本章将使用CXF来访问Activiti的服务。由于接口需要权限验证,因此原来的访问代码要作部分修改。代码清单17-8为客户端代码。

        代码清单17-8:codes\17\cxf-client\src\org\crazyit\activiti\FirstTest.java

        // 创建WebClient,设置URL、认证用户名和密码,注意用户名密码在 ACT_ID_USER 表配置         WebClient client = WebClient.create(                 "http://localhost:8080/activiti-rest/service/management/properties",                 "crazyit", "123456", null);         // 设置认证格式为基础认证格式         String authorizationHeader = "Basic "                 + org.apache.cxf.common.util.Base64Utility                         .encode("user:password".getBytes());         client.header("Authorization", authorizationHeader);         // 获取响应         Response response = client.get();         // 获取响应内容         InputStream ent = (InputStream) response.getEntity();         String content = IOUtils.readStringFromStream(ent);         // 输出字符串         System.out.println(content); 

        代码清单17-8中的粗体字代码,添加了认证信息,访问的是流程引擎配置接口,运行后可以看到输出的JSON字符串如下:

{"cfg.execution-related-entities-count":"false","next.dbid":"3801","schema.version":"6.0.0.4","schema.history":"create(5.10) upgrade(5.10->6.0.0.4)"}

        接下来,笔者将以流程存储服务为例子,调用activiti-rest发布的接口。

本文节选自《疯狂工作流讲义(第2版)》

疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397

工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577

本书代码目录:https://gitee.com/yangenxiong/CrazyActiviti

本文发表于2017年11月30日 10:33
(c)注:本文转载自https://my.oschina.net/JavaLaw/blog/1581902,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2376 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1