公司作的系統之間的交互用到了webservice作交互,如今對webservice作一個總結。java
1.配置已有的webserviceweb
webservice主要包括json
通常webservice的訪問包括四種格式:ide
java對webservice的支持沒有.net作的那麼好,只能支持其中一種(soap-post),下面就用http-get使用HttpURLConnection作的webservice的調用post
首先登錄http://www.webxml.com.cn/zh_cn/index.aspx右邊有個最新webservice測試
這裏用中文<>英文雙向翻譯web服務做爲例子,打開頁面點擊其中的服務說明,如圖所示(很差意思,qq截圖不知道怎麼的打不了中文,我就用簡單的英文代替了)url
打開:是關於這個webservice的WSDL文件,這個文件咱們等下再去分析,咱們此時只須要拖到最下面,找到http-get 所須要用的URL,最下面應該會有四種訪問方式的URL,咱們只須要http-get的就能夠了。spa
url應該是:http://fy.webxml.com.cn/webservices/EnglishChinese.asmx,而後咱們回到上一個頁面,選擇:TranslatorSentenceString .net
這裏不選上一個是由於java對webservice沒有.net支持的那麼好,無法用dataset去接,如圖所示:翻譯
打開以後,發現須要輸入參數wordkey:
咱們能夠開始寫代碼了,用HttpURLConnection寫一個調用http-get方法的訪問類。
package com.mz.webservice.b; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class TransLatorService { public void translate(String keyWord) { //咱們要調用的webservice的url地址,咱們用拼接字符串的形式用?wordKey=xxx來進行拼接 String httpUrl = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx/Translator?wordKey="+keyWord; try { URL url = new URL(httpUrl); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //設置訪問時間 conn.setConnectTimeout(5000); //訪問方式爲get conn.setRequestMethod("GET"); //若是鏈接成功,則把返回的數據讀入buffer中 if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream is = conn.getInputStream(); ByteArrayOutputStream boas = new ByteArrayOutputStream(); byte[] buffer = new byte[10240]; int len = -1; while((len = is.read(buffer)) != -1) { boas.write(buffer, 0, len); } System.out.println("the output is:" + boas.toString("UTF-8")); boas.close(); is.close(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { TransLatorService ts = new TransLatorService(); ts.translate("death"); } }
返回值應該是一個關於單詞「death」的xml
the output is:<?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://WebXml.com.cn/"> <xs:schema id="Dictionary" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="Dictionary" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Trans"> <xs:complexType> <xs:sequence> <xs:element name="WordKey" type="xs:string" minOccurs="0" /> <xs:element name="Pron" type="xs:string" minOccurs="0" /> <xs:element name="Info" type="xs:string" minOccurs="0" /> <xs:element name="Translation" type="xs:string" minOccurs="0" /> <xs:element name="Mp3" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Refer"> <xs:complexType> <xs:sequence> <xs:element name="Rel" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Sentence"> <xs:complexType> <xs:sequence> <xs:element name="Orig" type="xs:string" minOccurs="0" /> <xs:element name="Trans" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <Dictionary xmlns=""> <Trans diffgr:id="Trans1" msdata:rowOrder="0"> <WordKey>death</WordKey> <Pron>deθ</Pron> <Info /> <Translation>n. 死,死亡;死神</Translation> <Mp3>1694.mp3</Mp3> </Trans> <Sentence diffgr:id="Sentence1" msdata:rowOrder="0"> <Orig>That motorbike will be the death of you.</Orig> <Trans>那輛摩托車就會要了你的命。</Trans> </Sentence> <Sentence diffgr:id="Sentence2" msdata:rowOrder="1"> <Orig>That defeat meant the death of all my hopes.</Orig> <Trans>那次失敗毀滅了我全部的但願。</Trans> </Sentence> <Sentence diffgr:id="Sentence3" msdata:rowOrder="2"> <Orig>Car accident caused many deaths.</Orig> <Trans>車禍形成不少人死亡。</Trans> </Sentence> </Dictionary> </diffgr:diffgram> </DataSet>
咱們剩下須要作的就是對這個xml進行解析,本身封裝一個解析類和方法,這樣作是很費時費力的,因此java提供了一套本身的機制。
咱們能夠直接封裝成實體類,直接調用方法,傳遞實體類返回實體類的方法來進行調用。
經過wsimport 命令進行生成相應的webservice的實體類。(提醒:必須配置java的環境變量,請自行上網參考,若是不會配置,而且須要jdk1.6_21的版本以上,不然會報錯!而且,請保持項目中的jre和控制檯版本的一致性!)
語法 wsimport [opations] <wsdl_uri>
- wsdl_uri:wsdl 的統一資源標識符
- d :指定要輸出的文件的位置
- s :表示要解析java的源碼 ,默認解析出的是class字節碼
- p : 指定輸出的包名
比如咱們若是要把剛剛的webservice服務進行相應的實體類的轉換,就是:
wsimport http://fy.webxml.com.cn/webservices/EnglishChinese.asmx?WSDL
這裏只會生成字節碼文件,沒有.java文件,而且字節碼文件會出如今你控制檯目前的路徑下,因此這裏先cd到了桌面,如圖所示:
這裏報錯了,說明不能把相應的WSDL轉爲咱們須要的代理類,那麼咱們就能夠把相應的網頁的xml報錯到本地,命名隨意,我就命名的a.xml(由於其實命令是解析一個wsdl文件,那麼不論是解析網頁的仍是本地的實際上是同樣的)
找到相應的錯誤的地方(line 19 line 105)如圖所示
既然沒有辦法解析,那麼就把這一行刪除掉,而後從新解析,命令以下:
cd Desktop(先轉移到桌面,由於xml文件是報錯在桌面的)
wsimport a.xml
warning是對其餘幾種方式的不能解析,因此沒有error就算是解析成功了,如圖所示:
若是須要相應的指定,須要:
wsimport -s ./ -p com.hp.webservice.getTranslatorInfo a.xml
這裏的-s是指的要生成的源碼地址,-p是包名,以下圖所示:
這個時候就能夠新建一個項目,而後把上面生成的java文件拷到src目錄下(此處不截圖了,由於咱們要分析一個最重要的東西,就是WSDL文件)
首先必須說明WSDL文件是從下往上看的:
往回找,如圖所示:
接着往上找:
接着向上找
最後找到參數類型:
tips:我知道有人會說那上面有的地方有中文解釋爲何還要找,我只想說不少時候不少公司內部的WSDL文件沒那麼友好,至少咱們公司就沒有!因此仍是一步一步的
找上去吧,還有一個是最後的返回類型是TranlatorResult,有人說找不到,這個是定義在別的xml文件裏的,就不去找了,反正知道返回的是一個List就能夠了,下一篇咱們本身來建立webservice項目會再說明的
綜上的WSDL文檔所述:
好了,下面咱們寫一個測試類:
package com.hp.webservice.getTranslatorInfo.test; import java.util.List; import com.hp.webservice.getTranslatorInfo.ArrayOfString; import com.hp.webservice.getTranslatorInfo.EnglishChinese; import com.hp.webservice.getTranslatorInfo.EnglishChineseSoap; public class GetTranslatorTest { public static void main(String[] args) { //首先先得到一個服務 EnglishChinese eng = new EnglishChinese(); //經過服務獲取其中一種的soap方式 EnglishChineseSoap soap = eng.getEnglishChineseSoap(); //調用translatorString方法,而且傳遞一個英文單詞做爲參數 ArrayOfString arrays = soap.translatorString("death"); //返回是一個webservice自定義的類型,咱們須要經過getString方法得到List List<String> infos = arrays.getString(); //經過xml文檔分析,list中的第四個元素是單詞釋義,輸出單詞釋義 System.out.println(infos.get(3)); } }
輸出結果應該是:
n. 死,死亡;死神
好了,到這裏咱們基本能夠去使用別人的webservice了,本身建一個webservice項目下次再講