您的位置:首页 > 其它

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

2017-11-30 00:00 477 查看
摘要: Activiti REST Web Service

本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
疯狂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版)》
京东购买地址:https://item.jd.com/12246565.html
疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397
工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577
本书代码目录:https://gitee.com/yangenxiong/CrazyActiviti



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Activiti REST Web Service