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


    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地址,表死我们引用了这个结构定义。

        然后泥瓦匠用配置核心的配置。在<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("服务端获取到客户端的报文如下: "+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(" 请求报文XML: "+regRequestXml);
            
           /** 获取的Result报文,然后客户端处理业务。 */
           String resultString = HttpUtil.doPost("http://localhost:8080/imaopay/pay/ipservice/user/doTest",regRequestXml);
            
           System.out.println(" 获取的Result报文: "+resultString);
            
       }

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

    客户端打印如下:

    image

    服务端获取结果如下:

    image

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

    Reprint it anywhere u want.

  • 相关阅读:
    1、线性DP 213. 打家劫舍 II
    如何在CentOS 8上安装Vtiger CRM?
    如何在不使用密码的情况下切换(su)到另一个用户帐户
    如何解决Ubuntu上的Busybox Initramfs错误
    Linux中的16个Echo命令示例
    如何在Ubuntu 20.04 LTS Focal Fossa上安装Grafana
    如何在Ubuntu 20.04上安装Apache ZooKeeper
    如何在Ubuntu 20.04 LTS Focal Fossa上安装Prometheus
    如何在CentOS 8上安装GlassFish
    如何在CentOS 8上安装Netdata Monitoring
  • 原文地址:https://www.cnblogs.com/Alandre/p/4302233.html
Copyright © 2020-2023  润新知