疯狂Activiti6.0连载(21)Activiti的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

140509_5TSO_3665821.png

转载于:https://my.oschina.net/JavaLaw/blog/1581902

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值