天天看點

[CXF REST标準實戰系列] 二、Spring4.0 整合 CXF3.0,實作測試接口介紹RESTful架構風格Spring配置CXF三層初設計,實作WebService接口層HTTPClient 用戶端,并實作簡單調用

reprint it anywhere u want.

文章points:

1、介紹restful架構風格

2、spring配置cxf

3、三層初設計,實作webservice接口層

4、撰寫httpclient 用戶端,并實作簡單調用

    rest是rest之父roy thomas創造的,當時提出來了rest的6個特點:用戶端-伺服器的、無狀态的、可緩存的、統一接口、分層系統和按需編碼。其具有跨語言和跨平台的優勢。

    rest是一種架構風格。其描述性的狀态包括資源資料的内容和表達格式(xml,json等)。請求其中一個資源:方為一個指定性和描述性的uri,經由http将資源的表達從伺服器轉移到用戶端,或者相反方向。

    rest不是一種技術,也不是一個标準或者協定,它擁有标準:http+uri+xml(json),來實作其要求的架構風格。

    泥瓦匠的記憶宮殿:“rest其實就像萬能規則一樣。如果你遵循它的規則的話,就能得她提供給你的資源資料。”

    泥瓦匠用的是spring4.0.x和cxf3.0.x版本。有兄長說過讓我用其他的輕量級的web service架構,我最後考慮了下還是用cxf。

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

<a href="http://www.bysocket.com/?p=133#">?</a>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<code>&lt;</code><code>dependency</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>groupid</code><code>&gt;org.apache.cxf&lt;/</code><code>groupid</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>artifactid</code><code>&gt;cxf-rt-frontend-jaxws&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>version</code><code>&gt;3.0.3&lt;/</code><code>version</code><code>&gt;</code>

<code>&lt;/</code><code>dependency</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>artifactid</code><code>&gt;cxf-rt-transports-http&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>artifactid</code><code>&gt;cxf-rt-frontend-jaxrs&lt;/</code><code>artifactid</code><code>&gt;</code>

在以前2.x的cxf上,bug和配置上很複雜。3.0以後很友善,用了maven後,就是直接拷貝下上面的代碼放到pom.xml即可。

2、配置spring檔案

    首先配置cxf所需的xsd位址,表死我們引用了這個結構定義。

16

<code>//...配置cxf</code>

<code>&lt;/</code><code>beans</code><code>&gt;</code>

    然後泥瓦匠用配置核心的配置。在&lt;beans&gt;&lt;/beans&gt;直接加入所需要的cxf配置。

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<code>&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"reguser"</code> <code>class</code><code>=</code><code>"com.xidian.wq.imaopay.controller.webservice.userinfocontroller"</code><code>&gt;&lt;/</code><code>bean</code><code>&gt;</code>

<code>    </code> 

<code>    </code><code>&lt;!-- cxf 攔截器 &lt;ref bean="tokeninterceptor" /&gt;</code>

<code>    </code><code>&lt;bean id="tokeninterceptor" class="com.xidian.wq.imaopay.interceptor.cxf.tokeninterceptor" /&gt;</code>

<code>     </code><code>--&gt;</code>

<code>     </code> 

<code>    </code><code>&lt;!-- address-請求路徑 --&gt;</code>

<code>    </code><code>&lt;</code><code>jaxrs:server</code> <code>id</code><code>=</code><code>"imaopayservice"</code> <code>address</code><code>=</code><code>"/ipservice"</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 輸入攔截器設定 --&gt;</code>

<code>        </code><code>&lt;</code><code>jaxrs:ininterceptors</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>jaxrs:ininterceptors</code><code>&gt;</code>

<code>        </code> 

<code>        </code><code>&lt;!-- 輸出攔截器設定 --&gt;</code>

<code>        </code><code>&lt;</code><code>jaxrs:outinterceptors</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>jaxrs:outinterceptors</code><code>&gt;</code>

<code>         </code> 

<code>        </code><code>&lt;!-- servicebeans-暴露的webservice服務類 --&gt;</code>

<code>        </code><code>&lt;</code><code>jaxrs:servicebeans</code><code>&gt; </code>

<code>            </code><code>&lt;</code><code>ref</code> <code>bean</code><code>=</code><code>"reguser"</code> <code>/&gt;</code>

<code>        </code><code>&lt;/</code><code>jaxrs:servicebeans</code><code>&gt;</code>

<code>          </code> 

<code>        </code><code>&lt;!-- 支援的協定 --&gt;</code>

<code>        </code><code>&lt;</code><code>jaxrs:extensionmappings</code><code>&gt; </code>

<code>            </code><code>&lt;</code><code>entry</code> <code>key</code><code>=</code><code>"json"</code> <code>value</code><code>=</code><code>"application/json"</code> <code>/&gt; </code>

<code>            </code><code>&lt;</code><code>entry</code> <code>key</code><code>=</code><code>"xml"</code>  <code>value</code><code>=</code><code>"application/xml"</code> <code>/&gt; </code>

<code>        </code><code>&lt;/</code><code>jaxrs:extensionmappings</code><code>&gt; </code>

<code>        </code><code>&lt;!-- 編碼格式 --&gt;</code>

<code>        </code><code>&lt;</code><code>jaxrs:languagemappings</code><code>&gt;</code>

<code>               </code><code>&lt;</code><code>entry</code> <code>key</code><code>=</code><code>"en"</code> <code>value</code><code>=</code><code>"en-gb"</code><code>/&gt;</code>

<code>        </code><code>&lt;/</code><code>jaxrs:languagemappings</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>jaxrs:server</code><code>&gt;</code>

    根據代碼的備注,泥瓦匠想讓大家記住幾點重要性的點。

address=”/ipservice” 表示我們以後用此位址通路所提供的位址。

&lt;jaxrs:servicebeans&gt;&lt;jaxrs:servicebeans/&gt; 之間加入我們要暴露出去的服務類。這裡泥瓦匠以一個簡單的注冊類來提供。

jaxrs:extensionmappings 是表示我們需要支援的協定。

3、userinfocontroller是我們需要完成的暴露服務類。下面泥瓦匠說一下初設計(這點請大家指點指點)。

    初設計:

    按着原來的springmvc的三層架構,我這邊把原來的controller層轉為暴露在出來的接口服務類。自然view層也就沒了。

userinfocontroller的代碼如下:

<code>@path("/user")// 通路路徑</code>

<code>@produces("*/*")</code>

<code>public class userinfocontroller</code>

<code>{</code>

<code>    </code><code>@post</code>

<code>    </code><code>@path("/dotest")// 通路路徑</code>

<code>    </code><code>@produces({mediatype.application_xml, mediatype.application_json})// 響應内容 mime 類型</code>

<code>    </code><code>public string dotest(string requestxml)//@queryparam("regrequestxml")</code>

<code>    </code><code>{</code>

<code>        </code><code>system.out.println("服務端擷取到用戶端的封包如下:\n"+requestxml);</code>

<code>        </code><code>/* 構造響應封包 */</code>

<code>        </code><code>string responsexml = "響應的封包内容";//構造封包 xml 格式的字元串</code>

<code>        </code><code>return responsexml;</code>

<code>    </code><code>}</code>

<code>}</code>

暴露的接口層,也可以用inteface類加實作類來完成。泥瓦匠覺得多此一舉,興許我大言不慚。

    泥瓦匠總結如下:

    @post 表示http的通路模式

    @path 表示通路路徑

    @produces({mediatype.application_xml, mediatype.application_json}) 響應内容 mime 類型

    “實踐出真理。”拿出來遛一遛即可。泥瓦匠簡單的用httpclient通路

核心代碼如下:

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

<code>/**</code>

<code>    </code><code>* 注冊封包發送案例</code>

<code>    </code><code>*/ </code>

<code>   </code><code>private void doregxml() throws exception</code>

<code>   </code><code>{ </code>

<code>       </code><code>/** 構造測試封包頭對象 */</code>

<code>       </code><code>string randnum = randomstringutils.randomnumeric(8);//八位</code>

<code>       </code><code>string timestr = timeutil.gettimesimple();</code>

<code>       </code><code>databean databean = new databean();</code>

<code>       </code><code>databean.setbatch_no("n20150204");</code>

<code>       </code><code>databean.setdata_type("000001");</code>

<code>       </code><code>databean.setversion("v1.0");</code>

<code>       </code><code>databean.setuser_name("13957706713");</code>

<code>       </code><code>databean.setmsg_sign("未知");</code>

<code>       </code><code>databean.setrd_num(randnum);</code>

<code>       </code><code>databean.setrd_time(timestr);</code>

<code>       </code><code>databean.setk_sign(tokencheckutil.getsignature(null, timestr, randnum));</code>

<code>       </code><code>/** 構造測試封包體對象 */</code>

<code>       </code><code>regbean regbean = new regbean();</code>

<code>       </code><code>regbean.setreg_sn("reg20150204");</code>

<code>       </code><code>regbean.setuser_id(15);</code>

<code>       </code><code>regbean.setreg_no("33");</code>

<code>       </code><code>regbean.setreg_way("pc");</code>

<code>       </code><code>regbean.setset_time(timeutil.gettimeall());</code>

<code>       </code><code>regbean.setret_url("未知");</code>

<code>       </code><code>regbean.setremarks("無備注");</code>

<code>       </code> 

<code>       </code><code>regbean regbean2 = new regbean();</code>

<code>       </code><code>regbean2.setreg_sn("reg20150203");</code>

<code>       </code><code>regbean2.setuser_id(13);</code>

<code>       </code><code>regbean2.setreg_no("44");</code>

<code>       </code><code>regbean2.setreg_way("mobile");</code>

<code>       </code><code>regbean2.setset_time(timeutil.gettimeall());</code>

<code>       </code><code>regbean2.setret_url("未知");</code>

<code>       </code><code>regbean2.setremarks("無備注");</code>

<code>       </code><code>list&lt;</code><code>regbean</code><code>&gt; regbeans = new arraylist&lt;</code><code>regbean</code><code>&gt;();</code>

<code>       </code><code>regbeans.add(regbean);</code>

<code>       </code><code>regbeans.add(regbean2);</code>

<code>       </code><code>msgregbean msgregbean = new msgregbean();</code>

<code>       </code><code>msgregbean.setdatabean(databean);</code>

<code>       </code><code>msgregbean.setregbeans(regbeans);</code>

<code>       </code><code>string regrequestxml = jaxbobjectandxmlutil.object2xml(msgregbean);//構造封包 xml 格式的字元串</code>

<code>       </code><code>system.out.println("\n 請求封包xml: \n"+regrequestxml);</code>

<code>       </code><code>/** 擷取的result封包,然後用戶端處理業務。 */</code>

<code>       </code><code>system.out.println("\n 擷取的result封包: \n"+resultstring);</code>

<code>   </code><code>}</code>

運作後,控制台列印出如下結果:

用戶端列印如下:

[CXF REST标準實戰系列] 二、Spring4.0 整合 CXF3.0,實作測試接口介紹RESTful架構風格Spring配置CXF三層初設計,實作WebService接口層HTTPClient 用戶端,并實作簡單調用

服務端擷取結果如下:

[CXF REST标準實戰系列] 二、Spring4.0 整合 CXF3.0,實作測試接口介紹RESTful架構風格Spring配置CXF三層初設計,實作WebService接口層HTTPClient 用戶端,并實作簡單調用