1. 程式人生 > >java呼叫webservice,比較簡單方便的方法。

java呼叫webservice,比較簡單方便的方法。

  首先,請同學們自行了解webservice的基礎知識。
  個人理解,webservice約等於使用http+xml技術進行跨平臺的資料互動。
  http和xml我們都很熟悉了,把他們兩個組合到一起就是webservice了,http負責資訊傳輸,xml負責資訊的組織。這麼理解雖然說簡單了一點,但如果你只需要呼叫webservice服務,而不需要去建立並維護話,這樣理解也就夠了。

  1.用xml組織資訊
  好了,那麼我們就先從xml說起,我們需要把一些請求的資訊傳送給webservice伺服器,而伺服器又需要把響應的訊息反饋給我們。因為xml的跨平臺特性,在webservice裡使用了xml作為資訊的組織形式。也就是說客戶端與伺服器之間說話的方式,是互相傳遞xml檔案。
  
  2.用http傳送資訊
  那麼傳送xml檔案的任務就交給http來做了,我們把http請求中HttpURLConnection的Content-Type設定成text/xml;charset=UTF-8,那麼我們的http就可以傳送xml檔案了。

  3.傳送的xml長啥樣?
  很好,那我們就傳送一個xml給伺服器就好,然後伺服器把要說的話也放到一個xml裡返回給我們。可是,可是,我們怎麼知道要對伺服器說什麼?伺服器可以提供哪些服務?這些服務又需要提供哪些引數?這些我們統統不知道啊。
  對了,我們的wsdl登場了,wsdl相當於一個諮詢臺,它可以告訴你,伺服器都提供了哪些服務,哪個服務要提供哪些引數。我們怎麼找到wsdl呢?原來webservice服務都會把wsdl釋出到網上,有需要的朋友們就可以自取啦。
  感謝網友們的力量,這是一些開放的webservice,大家可以進去看一下。
  https://my.oschina.net/CraneHe/blog/183471


  像這樣,伺服器會提供一個wsdl的連結給你,你可以嘗試在瀏覽器裡開啟這個連結(比如http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl),那就可以看到以下這些資訊了:
wsdl示例
  這裡面的資訊好複雜,看不懂啊。。。要學習wsdl又很費時間,所以博主就從網上找了個工具,自動把這個wsdl諮詢臺裡諮詢員的方言翻譯成了普通話~博主用的這個叫做storm的軟體(http://www.cr173.com/soft/12037.html),當然類似的工具有很多(比如這些:http://www.codeceo.com/article/12-great-webservice-test-tool.html
)。storm裡我們點選新增,輸入了wsdl以後,wsdl的內容就被翻譯過來了:
翻譯過後的wsdl內容
  這個服務就是你輸入一個qq號,它就告訴你這個qq號的線上狀態,所以需要你提供一個qq號作為引數。上圖中,樹形結構裡展示了需要我們填寫的引數qqCode。點選raw view按鈕,就看到完整的xml內容了,下圖中,左邊是傳送的請求xml內容,右邊是伺服器返回的xml內容。
raw view in storm
  (原來xml的複雜格式都是套路)
  4.開始編碼啦
  好的,準備工作完成!現在我們總結一下,我們要用http傳送一個xml到伺服器上去,然後把伺服器返回的xml內容拿來用。傳送給伺服器的xml的內容,就用我們軟體從wsdl解析出來的樣式。那麼,我們開始愉快的編碼吧,這裡我用的java語言,大家也可以借鑑文末的文章裡提到的其他語言。

    try {
        String urlStr = "http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx";
        URL url = new URL(urlStr);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setDoInput(true);
        con.setDoOutput(true);
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
        OutputStream oStream = con.getOutputStream();
        //下面這行程式碼是用字串拼出要傳送的xml,xml的內容是從測試軟體裡拷貝出來的
        //需要注意的是,有些空格不要弄丟哦,要不然會報500錯誤的。
        //引數什麼的,你可以封裝一下方法,自動生成對應的xml指令碼
        String soap = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
        "<soap:Envelope "+
        "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" "+ "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "+ "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"+ 
          "<soap:Body>"+ 
            "<qqCheckOnline xmlns=\"http://WebXml.com.cn/\">"+ 
              "<qqCode>12345678</qqCode>"+ //你的qq號填到裡邊
            "</qqCheckOnline> "+ 
          "</soap:Body>"+ 
        "</soap:Envelope>";
        oStream.write(soap.getBytes());
        oStream.close();

        InputStream iStream = con.getInputStream();
        Reader reader = new InputStreamReader(iStream);

        int tempChar;
        String str = new String();
        while((tempChar = reader.read()) != -1){
            str += (char) tempChar;
        }
        //下面這行輸出返回的xml到控制檯,相關的解析操作大家自己動手嘍。
        //如果想要簡單的話,也可以用正則表示式取結果出來。
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>returnedxmlstr:"+str);
        iStream.close();
        oStream.close();
        con.disconnect();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }