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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<code><</code><code>dependency</code><code>></code>
<code> </code><code><</code><code>groupid</code><code>>org.apache.cxf</</code><code>groupid</code><code>></code>
<code> </code><code><</code><code>artifactid</code><code>>cxf-rt-frontend-jaxws</</code><code>artifactid</code><code>></code>
<code> </code><code><</code><code>version</code><code>>3.0.3</</code><code>version</code><code>></code>
<code></</code><code>dependency</code><code>></code>
<code> </code><code><</code><code>artifactid</code><code>>cxf-rt-transports-http</</code><code>artifactid</code><code>></code>
<code> </code><code><</code><code>artifactid</code><code>>cxf-rt-frontend-jaxrs</</code><code>artifactid</code><code>></code>
在以前2.x的cxf上,bug和配置上很複雜。3.0以後很友善,用了maven後,就是直接拷貝下上面的代碼放到pom.xml即可。
2、配置spring檔案
首先配置cxf所需的xsd位址,表死我們引用了這個結構定義。
16
17
18
19
20
21
22
23
24
25
26
27
28
<code>//...配置cxf</code>
<code></</code><code>beans</code><code>></code>
然後泥瓦匠用配置核心的配置。在<beans></beans>直接加入所需要的cxf配置。
29
30
31
32
33
<code><</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>></</code><code>bean</code><code>></code>
<code> </code>
<code> </code><code><!-- cxf 攔截器 <ref bean="tokeninterceptor" /></code>
<code> </code><code><bean id="tokeninterceptor" class="com.xidian.wq.imaopay.interceptor.cxf.tokeninterceptor" /></code>
<code> </code><code>--></code>
<code> </code>
<code> </code><code><!-- address-請求路徑 --></code>
<code> </code><code><</code><code>jaxrs:server</code> <code>id</code><code>=</code><code>"imaopayservice"</code> <code>address</code><code>=</code><code>"/ipservice"</code><code>></code>
<code> </code><code><!-- 輸入攔截器設定 --></code>
<code> </code><code><</code><code>jaxrs:ininterceptors</code><code>></code>
<code> </code><code></</code><code>jaxrs:ininterceptors</code><code>></code>
<code> </code>
<code> </code><code><!-- 輸出攔截器設定 --></code>
<code> </code><code><</code><code>jaxrs:outinterceptors</code><code>></code>
<code> </code><code></</code><code>jaxrs:outinterceptors</code><code>></code>
<code> </code>
<code> </code><code><!-- servicebeans-暴露的webservice服務類 --></code>
<code> </code><code><</code><code>jaxrs:servicebeans</code><code>> </code>
<code> </code><code><</code><code>ref</code> <code>bean</code><code>=</code><code>"reguser"</code> <code>/></code>
<code> </code><code></</code><code>jaxrs:servicebeans</code><code>></code>
<code> </code>
<code> </code><code><!-- 支援的協定 --></code>
<code> </code><code><</code><code>jaxrs:extensionmappings</code><code>> </code>
<code> </code><code><</code><code>entry</code> <code>key</code><code>=</code><code>"json"</code> <code>value</code><code>=</code><code>"application/json"</code> <code>/> </code>
<code> </code><code><</code><code>entry</code> <code>key</code><code>=</code><code>"xml"</code> <code>value</code><code>=</code><code>"application/xml"</code> <code>/> </code>
<code> </code><code></</code><code>jaxrs:extensionmappings</code><code>> </code>
<code> </code><code><!-- 編碼格式 --></code>
<code> </code><code><</code><code>jaxrs:languagemappings</code><code>></code>
<code> </code><code><</code><code>entry</code> <code>key</code><code>=</code><code>"en"</code> <code>value</code><code>=</code><code>"en-gb"</code><code>/></code>
<code> </code><code></</code><code>jaxrs:languagemappings</code><code>></code>
<code> </code><code></</code><code>jaxrs:server</code><code>></code>
根據代碼的備注,泥瓦匠想讓大家記住幾點重要性的點。
address=”/ipservice” 表示我們以後用此位址通路所提供的位址。
<jaxrs:servicebeans><jaxrs:servicebeans/> 之間加入我們要暴露出去的服務類。這裡泥瓦匠以一個簡單的注冊類來提供。
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<</code><code>regbean</code><code>> regbeans = new arraylist<</code><code>regbean</code><code>>();</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>
運作後,控制台列印出如下結果:
用戶端列印如下:
服務端擷取結果如下: