[CXF REST標準實戰系列] 2、Spring4.0 整合 CXF3.0,實現測試接口

Writer:BYSocket(泥沙磚瓦漿木匠) java

Reprint it anywhere u want. web

文章Points: spring

一、介紹RESTful架構風格 apache

二、Spring配置CXF json

三、三層初設計,實現WebService接口層 緩存

四、撰寫HTTPClient 客戶端,並實現簡單調用 服務器

 

介紹RESTful架構風格

    REST是REST之父Roy Thomas創造的,當時提出來了REST的6個特色:客戶端-服務器的、無狀態的、可緩存的、統一接口、分層系統和按需編碼。其具備跨語言和跨平臺的優點。 架構

    REST是一種架構風格。其描述性的狀態包括資源數據的內容和表達格式(XML,JSON等)。請求其中一個資源:方爲一個指定性和描述性的URI,經由HTTP將資源的表達從服務器轉移到客戶端,或者相反方向。 app

    REST不是一種技術,也不是一個標準或者協議,它擁有標準:HTTP+URI+XML(JSON),來實現其要求的架構風格。 框架

   

    泥瓦匠的記憶宮殿:「REST其實就像萬能規則同樣。若是你遵循它的規則的話,就能得她提供給你的資源數據。」

 

Spring配置CXF

    泥瓦匠用的是Spring4.0.x和CXF3.0.x版本。有兄長說過讓我用其餘的輕量級的Web Service框架,我最後考慮了下仍是用CXF。

 

一、第一步配置所需的依賴包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便可。

 

二、配置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
<beanid="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:serverid="imaoPayService"address="/ipservice">
        <!-- 輸入攔截器設置 -->
        <jaxrs:inInterceptors>
        </jaxrs:inInterceptors>
         
        <!-- 輸出攔截器設置 -->
        <jaxrs:outInterceptors>
        </jaxrs:outInterceptors>
          
        <!-- serviceBeans-暴露的WebService服務類 -->
        <jaxrs:serviceBeans> 
            <refbean="regUser"/>
        </jaxrs:serviceBeans>
           
        <!-- 支持的協議 -->
        <jaxrs:extensionMappings> 
            <entrykey="json"value="application/json"/> 
            <entrykey="xml" value="application/xml"/> 
        </jaxrs:extensionMappings> 
         
        <!-- 編碼格式 -->
        <jaxrs:languageMappings>
               <entrykey="en"value="en-gb"/>
        </jaxrs:languageMappings>
         
    </jaxrs:server>

    根據代碼的備註,泥瓦匠想讓你們記住幾點重要性的點。

address=」/ipservice」 表示咱們之後用此地址訪問所提供的地址。

<jaxrs:serviceBeans><jaxrs:serviceBeans/> 之間加入咱們要暴露出去的服務類。這裏泥瓦匠以一個簡單的註冊類來提供。

jaxrs:extensionMappings 是表示咱們須要支持的協議。

 

三、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);
        
   }

運行後,控制檯打印出以下結果:

客戶端打印以下:

image

服務端獲取結果以下:

image

Writer:BYSocket(泥沙磚瓦漿木匠)

Reprint it anywhere u want.

相關文章
相關標籤/搜索