java webservice 總結(學會讀別人的webservice而且經過代理模式訪問)

公司作的系統之間的交互用到了webservice作交互,如今對webservice作一個總結。java

1.配置已有的webserviceweb

webservice主要包括json

  • xml/json:做爲傳輸數據的格式
  • soap:(simple object access protocol)對於http作的封裝,是webservice用的服務協議。也有一種說法是:http+xml+soap = webservice
  • wsdl:webservice define language:這是webservice的規範文件。

通常webservice的訪問包括四種格式:ide

  1. http-get
  2. http-post
  3. soap-get
  4. soap-post

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文檔所述:

  • 這個webservice的service name:EnglishChinese
  • 咱們所用的soap:EnglishChineseSoap
  • 調用方法名:TranslatorString
  • 輸入類型:String
  • 輸出類型:TransLatorResult(在生成的代理文件裏是AraayOfString)

 好了,下面咱們寫一個測試類:

 

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項目下次再講

相關文章
相關標籤/搜索