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

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

文章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

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:jaxws="http://cxf.apache.org/jaxws"

    xmlns:jaxrs="http://cxf.apache.org/jaxrs"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

    http://www.springframework.org/schema/context

    http://www.springframework.org/schema/context/spring-context-3.0.xsd

    http://cxf.apache.org/jaxws

    http://cxf.apache.org/schemas/jaxws.xsd

    http://cxf.apache.org/jaxrs

    http://cxf.apache.org/schemas/jaxrs.xsd">

//...配置cxf

</beans>

然后泥瓦匠用配置核心的配置。在<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);

       

   }

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

客户端打印如下:

服务端获取结果如下:

原文地址:https://www.cnblogs.com/yadongliang/p/8278513.html

时间: 2024-08-05 07:35:37

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

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

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1.介绍RESTful架构风格 2.Spring配置CXF 3.三层初设计,实现WebService接口层 4.撰写HTTPClient 客户端,并实现简单调用 介绍RESTful架构风格 REST是REST之父Roy Thomas创造的,当时提出来了REST的6个特点:客户端-服务器的.无状态的.可缓存的.统一接口.分层系

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

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1.不认识到犯错,然后得到永久的教训. 2.认识JAXB 3.代码实战 1.不认识到犯错,然后得到永久的教训. 也不是所谓的教训吧,真正的教训来自于对错误的剖析理解很深刻.然后有种"吃一堑,长一智"的感觉才叫教训.近日和团队工头们用CXF3.0和Spring4.0开发一个平台,模仿着第三方支付,用xml进行数据交互

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

SQL Server datetime数据类型设计.优化误区 一.场景 在SQL Server 2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你看到表的记录如下图所示,你最先想到的是什么呢? (图1:数据列表) 你看到这些数据,是不是觉得这样的设计既浪费了存储空间,又使得这个列的索引增大,查询起来更慢,你也想使用一些其它的数据类型来代替这个datetime吧? 其实大家都是这么想的,这个方向是100%正确的,但是在写这篇文章以前,我进入了两

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

其实与spring+springmvc+mybatis集成swagger没什么区别,只是之前写的太不好了,所以这次决定详细写. 提到swagger不得不提rest,rest是一种架构风格,里面有对不同的资源有不同的请求标识.例如PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH等. 对于技术的初学,最好的话还是建议去官网,官网最详细也最权威,虽然不少博客对此有挺好的解说,但还是强烈建议去官网,不要求仔仔细细阅读,至少读个大概. 对于目前,有人要问我swagger能做什么

RHCA RH442实战系列(二)之Linux buffer内存释放

1. 说明   Linux的内核负责硬件管理,资源调度,进程管理,和资源管理等相关工作,其中内存资源管理做为kernel的一项非常重要的工作.kernel在处理文件时,如打开一个文件,会将文件的元数据信息,即文件名,inode等信息记录在buffer中,后续重复读取相同的文件,则直接冲buffer中读取,这样的机制能够提高速度,此外,对于文件的内容,将会记录在cache中保存,对于buffer和cache,内存会有自动清理的机制,如果buffer和cache一直无法释放,可能导致的原因有:内存泄

openstack运维实战系列(二十)之neutron创建网络并指定vlan号码

1. 背景说明   neutron在openstack中负责instance的网络,如虚拟机内部网络,虚拟机外部网络等,和实体网络相类似,openstack中的网络也存在路由器router,交换机switch,网络network,子网subnet,端口port等概念,这些功能都有neutron来完成,neutron由有个不同的插件plugins组成,如二层插件neutron-openvswitch-agent,三层插件neutron-l3-agent,动态地址分配neutron-dhcp-age

spring4.0整合mongodb3.0.4项目实践(用户验证)

我们的项目用到了spring框架和mongdb数据库,随着mongodb升级到3.0已有半年时间,我们也开始随之升级,但是3.0的用户验证有所更改,导致原来的很多配置无法再用. 经过几天的尝试后,终于成功的用spring配置验证. 升级用了两个新的jar包,分别是pring-data-mongodb1.7.2(http://pan.baidu.com/s/1bnkAA67)和mongodb-java-driver3.0.2(http://pan.baidu.com/s/1jG6bc3c): sp

ElasticSearch实战系列四: ElasticSearch理论知识介绍

前言 在前几篇关于ElasticSearch的文章中,简单的讲了下有关ElasticSearch的一些使用,这篇文章讲一下有关 ElasticSearch的一些理论知识以及自己的一些见解. 虽然本人是一个实战派,不太喜欢讲这些理论知识,因为这块可以查看官方文档,那里会写得非常详细,但是在使用了ElasticSearch之后,发现有的知识点需要掌握一定的理论知识才能理解,对于初学者来说有的不好理解,因此写下该篇文章,希望读者在看完之后能够有所帮助. ElasticSearch 理论知识介绍 Ela

AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码

AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型 . AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码 开篇唠嗑 本篇内容写在5.1假期前夕,主要是让大家能在节假日休息充点的时候能有好的干货例子,到目前为止netcore方面的实战例子分享即将进入正轨,谢谢各位朋友多多支持:最近工作安排的新项目即将开始,项目前期就我一人搭建,让我犹豫的是对于公司这个内部系统并且是初建的项目用什么开