Writer:BYSocket(泥沙砖瓦浆木匠)

Reprint it anywhere u want.

文章Points:

1、介绍RESTful架构风格

2、Spring配置CXF

3、三层初设计,实现WebService接口层

4、撰写HTTPClient 客户端,并实现简单调用

介绍RESTful架构风格

REST是REST之父Roy Thomas创造的,当时提出来了REST的6个特点:客户端-服务器的、无状态的、可缓存的、统一接口、分层系统和按需编码。其具有跨语言和跨平台的优势。

REST是一种架构风格。其描述性的状态包括资源数据的内容和表达格式(XML,JSON等)。请求其中一个资源:方为一个指定性和描述性的URI,经由HTTP将资源的表达从服务器转移到客户端,或者相反方向。

REST不是一种技术,也不是一个标准或者协议,它拥有标准:HTTP+URI+XML(JSON),来实现其要求的架构风格。

泥瓦匠的记忆宫殿:“REST其实就像万能规则一样。如果你遵循它的规则的话,就能得她提供给你的资源数据。”

Spring配置CXF

泥瓦匠用的是Spring4.0.x和CXF3.0.x版本。有兄长说过让我用其他的轻量级的Web Service框架,我最后考虑了下还是用CXF。

1、第一步配置所需的依赖包jars

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxrs</artifactId>
    <version>3.0.3</version>
</dependency>

在以前2.x的CXF上,bug和配置上很复杂。3.0以后很方便,用了MAVEN后,就是直接拷贝下上面的代码放到pom.xml即可。

2、配置Spring文件

首先配置CXF所需的XSD地址,表死我们引用了这个结构定义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

然后泥瓦匠用配置核心的配置。在<beans></beans>直接加入所需要的cxf配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<bean id="regUser" class="com.xidian.wq.imaopay.controller.webservice.UserInfoController"></bean>
     
    <!-- CXF 拦截器 <ref bean="tokenInterceptor" />
    <bean id="tokenInterceptor" class="com.xidian.wq.imaopay.interceptor.cxf.TokenInterceptor" />
     -->
      
    <!-- address-请求路径 -->
    <jaxrs:server id="imaoPayService" address="/ipservice">
        <!-- 输入拦截器设置 -->
        <jaxrs:inInterceptors>
        </jaxrs:inInterceptors>
         
        <!-- 输出拦截器设置 -->
        <jaxrs:outInterceptors>
        </jaxrs:outInterceptors>
          
        <!-- serviceBeans-暴露的WebService服务类 -->
        <jaxrs:serviceBeans
            <ref bean="regUser" />
        </jaxrs:serviceBeans>
           
        <!-- 支持的协议 -->
        <jaxrs:extensionMappings
            <entry key="json" value="application/json" /> 
            <entry key="xml"  value="application/xml" /> 
        </jaxrs:extensionMappings
         
        <!-- 编码格式 -->
        <jaxrs:languageMappings>
               <entry key="en" value="en-gb"/>
        </jaxrs:languageMappings>
         
    </jaxrs:server>

根据代码的备注,泥瓦匠想让大家记住几点重要性的点。

address=”/ipservice” 表示我们以后用此地址访问所提供的地址。

<jaxrs:serviceBeans><jaxrs:serviceBeans/> 之间加入我们要暴露出去的服务类。这里泥瓦匠以一个简单的注册类来提供。

jaxrs:extensionMappings 是表示我们需要支持的协议。

3、UserInfoController是我们需要完成的暴露服务类。下面泥瓦匠说一下初设计(这点请大家指点指点)。

三层初设计,实现WebService接口层

初设计:

按着原来的SpringMVC的三层架构,我这边把原来的Controller层转为暴露在出来的接口服务类。自然View层也就没了。

UserInfoController的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Path("/user")// 访问路径
@Produces("*/*")
public class UserInfoController
{
    @POST
    @Path("/doTest")// 访问路径
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})// 响应内容 MIME 类型
    public String doTest(String requestXml)//@QueryParam("regRequestXml")
    {
        System.out.println("服务端获取到客户端的报文如下:\n"+requestXml);
         
        /* 构造响应报文 */
        String responseXml = "响应的报文内容";//构造报文 XML 格式的字符串
         
        return responseXml;
    }
}

暴露的接口层,也可以用inteface类加实现类来完成。泥瓦匠觉得多此一举,兴许我大言不惭。

泥瓦匠总结如下:

@POST 表示HTTP的访问模式

@Path 表示访问路径

@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 响应内容 MIME 类型

泥瓦匠还在上一篇写过了对报文的处理:JAXB xml与javaBean的转换。具体请查阅。

HTTPClient 客户端,并实现简单调用

“实践出真理。”拿出来遛一遛即可。泥瓦匠简单的用HTTPClient访问

核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
    * 注册报文发送案例
    */ 
   private void doRegXml() throws Exception
   
       /** 构造测试报文头对象 */
       String randNum = RandomStringUtils.randomNumeric(8);//八位
       String timeStr = TimeUtil.getTimeSimple();
       DataBean dataBean = new DataBean();
       dataBean.setBatch_no("N20150204");
       dataBean.setData_type("000001");
       dataBean.setVersion("v1.0");
       dataBean.setUser_name("13957706713");
       dataBean.setMsg_sign("未知");
       dataBean.setRd_num(randNum);
       dataBean.setRd_time(timeStr);
       dataBean.setK_sign(TokenCheckUtil.getSignature(null, timeStr, randNum));
 
       /** 构造测试报文体对象 */
       RegBean regBean = new RegBean();
       regBean.setReg_sn("REG20150204");
       regBean.setUser_id(15);
       regBean.setReg_no("33");
       regBean.setReg_way("pc");
       regBean.setSet_time(TimeUtil.getTimeAll());
       regBean.setRet_url("未知");
       regBean.setRemarks("无备注");
        
       RegBean regBean2 = new RegBean();
       regBean2.setReg_sn("REG20150203");
       regBean2.setUser_id(13);
       regBean2.setReg_no("44");
       regBean2.setReg_way("mobile");
       regBean2.setSet_time(TimeUtil.getTimeAll());
       regBean2.setRet_url("未知");
       regBean2.setRemarks("无备注");
        
       List<RegBean> regBeans = new ArrayList<RegBean>();
       regBeans.add(regBean);
       regBeans.add(regBean2);
        
       MsgRegBean msgRegBean = new MsgRegBean();
       msgRegBean.setDataBean(dataBean);
       msgRegBean.setRegBeans(regBeans);
        
       String regRequestXml = JaxbObjectAndXmlUtil.object2Xml(msgRegBean);//构造报文 XML 格式的字符串
        
       System.out.println("\n 请求报文XML: \n"+regRequestXml);
        
       /** 获取的Result报文,然后客户端处理业务。 */
       String resultString = HttpUtil.doPost("http://localhost:8080/imaopay/pay/ipservice/user/doTest",regRequestXml);
        
       System.out.println("\n 获取的Result报文: \n"+resultString);
        
   }

运行后,控制台打印出如下结果:

客户端打印如下:

服务端获取结果如下:

Writer:BYSocket(泥沙砖瓦浆木匠)

Reprint it anywhere u want.

[CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口的更多相关文章

  1. [CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口(转)

    转自:[CXF REST标准实战系列] 二.Spring4.0 整合 CXF3.0,实现测试接口 文章Points: 1.介绍RESTful架构风格 2.Spring配置CXF 3.三层初设计,实现W ...

  2. [CXF REST标准实战系列] 一、JAXB xml与javaBean的转换(转)

    转自:[CXF REST标准实战系列] 一.JAXB xml与javaBean的转换 文章Points: 1.不认识到犯错,然后得到永久的教训. 2.认识JAXB 3.代码实战 1.不认识到犯错,然后 ...

  3. [CXF REST标准实战系列] 一、JAXB xml与javaBean的转换

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1.不认识到犯错,然后得到 ...

  4. WCF开发实战系列二:使用IIS发布WCF服务

    WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...

  5. shiro实战系列(二)之入门实战续

    下面讲解基于实战系列一,所以相关的java文件获取pom.xml及其log4j文件同样适用于本次讲解. 一.Using Shiro Using Shiro 现在我们的 SecurityManager ...

  6. SQL Server 性能优化实战系列(二)

    SQL Server datetime数据类型设计.优化误区 一.场景 在SQL Server 2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你 ...

  7. MP实战系列(二)之集成swagger

    其实与spring+springmvc+mybatis集成swagger没什么区别,只是之前写的太不好了,所以这次决定详细写. 提到swagger不得不提rest,rest是一种架构风格,里面有对不同 ...

  8. ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解

    前言 在上一篇中介绍了ElasticSearch集群和kinaba的安装教程,本篇文章就来讲解下 ElasticSearch的DSL语句使用. ElasticSearch DSL 介绍 Elastic ...

  9. SpringBoot基础实战系列(一)整合视图

    SpringBoot整合freemarker 1.添加依赖:springboot基本上是无缝衔接,基本上只需要添加对应的依赖,不需要或者做很少量的配置即可 注:对于springboot项目的创建此处不 ...

随机推荐

  1. Python+Selenium 利用ID,XPath,tag name,link text,partial link text,class name,css,name定位元素

    使用firefox浏览器,查看页面元素,我们以“百度网页”为示例 一.ID定位元素    利用find_element_by_id()方法来定位网页元素对象 ①.定位百度首页,输入框的元素 ②.编写示 ...

  2. mac mysql5.7.17修改root初始密码(知道初始密码)

    最近在mac上装个mysql可以说是麻烦死了,在这里就说说修改初始密码吧! 刚开始的时候不知道怎么修改,于是上网百度,网上几乎都是说要先执行命令mysqld_safe --skip-grant-tab ...

  3. 使用kbmmw 生成客户端delphi函数原型

    前面我们讲了使用swagger 生成java,php 的客户端调用函数原型. 对于delphi,其实很遗憾,不能直接生成客户端函数原型代码. 不要紧,解铃还须系铃人,既然是kbmmw 自己生成的,我们 ...

  4. sf-1 算法

    算法基础 算法 算法(Algorithm):一个计算过程,解决问题的方法 DNiklaus Wirth:“程序=数据结构+算法” 时间复杂度 时间复杂度:用来评估算法运行效率的一个式子 时间复杂度-小 ...

  5. mysql的like子句

    直接上例子 查询字段以 php 开头的信息. SELECT * FROM position WHERE name LIKE 'php%'; 查询字段包含 php 的信息. SELECT * FROM ...

  6. BAT:通过连接符处理判断OR的关系

    使用情况说明: 适用于对某个文件夹下不同的文件夹(名称)做不同的处理,但存在需要对其中多个文件夹(名称)进行相同处理的情况 例子中的目录结构: .\1.2.3 -- 文件夹.\a.b.c -- 文件夹 ...

  7. H3C 路由策略(人为打环)

    拓扑如上 任务1:去除环路双ospf 引入 造成路由环路一边是 1             一边是10关掉任意lo口都会生成新的路由表 但是路由表指向不对 变成了一个圆 我们可以采用引入路由打上tag ...

  8. 基于TensorFlow的深度学习系列教程 1——Hello World!

    最近看到一份不错的深度学习资源--Stanford中的CS20SI:<TensorFlow for Deep Learning Research>,正好跟着学习一下TensorFlow的基 ...

  9. Spring-Data-Jpa环境配置与实际应用

    上次我们讲述了<Spring-Data-Jpa概述与接口>,接下来我们再讲讲Spring-Data-Jpa环境配置与实际应用. Spring-Data 方法定义规范与使用配置 简单条件查询 ...

  10. 深入浅出Redis

    一.Redis的诞生 Redis创建者,出生于西西里岛的意大利人(antirez)发明的,个人网站,http://invece.org.早年是系统管理员,2004-2006 年做嵌入式方面的工作,之后 ...