webservice使用的一些總結

轉載自http://www.cnblogs.com/lm3515/archive/2010/10/29/1864456.html

 

WebService使用的一些總結

 

什麼是WebService:

這個不用我在這裏廢話,網上的資料一搜一大把,若是你沒有接觸過這方面的知識,你能夠先去網上查一下。這裏我只想說一下我印象比較深入的幾點:html

WebService是基於soap協議的。說實話這個知識剛開始我理解的並非很到位。這也在很長的時間侷限了我在代碼過程當中的思惟。我會在後面一個關於天氣預報的實例中進行詳細介紹的。總之,全部的webService請求、應答都是創建在soap協議的基礎上的,而soap傳輸數據的載體是xml。關於soap協議的介紹,在W3C上有很詳細的教程。java

WSDL是WebService的描述語言,它定義了Web Service作什麼,怎麼作和查詢的信息。在驗證一個WebService是否好用的時候,咱們一般會選則在瀏覽器中輸入http://…….*?wsdl。若是顯示出一個xml文件,咱們就認爲這是好用的,反之就是不可用的。在項目剛剛開始的時候,我也是這麼天真的認爲的,由於教程上都是這麼演示的。但事實並不是如此,就如同如下調用天氣預報的wsdl。若是你在瀏覽器中輸入http://fhs.6617.com/getweather.asmx?WSDL,它是不顯示的,但事實證實這個webservice服務時可使用的(你能夠經過http://fhs.6617.com/getweather.asmx?WSDL生成本地代理類)。這也一直是初學WebService者的一個誤區。之因此不能經過瀏覽器訪問,可能緣由是服務發佈者,或者服務器作了一些限制,就如同互聯網上不少服務器,咱們能夠訪問卻ping不一樣同樣,服務者作了一些限制。(個人猜想)node

怎樣使用WebService

是否是調用WebService時,必需要獲得wsdl?必需要生成本地代理類?web

在回答這個問題,以前,我想先介紹一下網上一些資源:有不少熱心的人,收集了不少經常使用的WebService,如:http://lqixv.javaeye.com/blog/308407。其中羅列的每一種服務,做者都提供了三種鏈接:Endpoint Disco WSDL 。其實這就是隱約的告訴咱們調用webservice服務的三種途徑。apache

就如同咱們的項目,客戶端在調用電信WebService上行發短信時,是經過 wsdl生成本地代理類方式實行的。而在接收狀態報告下行時,採用的是 Endpoint方式(客戶端不須要生成本地代理類,只須要知道Endpoint地址)。api

因此wsdl很重要,但並非必須的,前提你能經過api,規範文檔等獲取你須要的地址、命名空間的相關信息。瀏覽器

如何調用wsdl生成本地代理類:

經過wsdl生成本地代理類,有不少方式,既能夠經過wsdl2java命令手動生成,也能夠經過eclipse的axis2插件、xfire插件等。可是經過項目的實踐,以爲儘可能仍是經過axis2的wsdl2java的命令生成,會省去不少麻煩。好比說,若是你擁有不少的wsdl文件,他們又是相互聯繫的,這樣你經過eclipse的插件生成時,會出現錯誤。由於它只能一下加載一個wsdl文件。這個問題在項目初期,讓我吃了不少的苦頭。。。。。服務器

Axis2是一個比較經常使用的WebService引擎,你們能夠經過到http://ws.apache.org/axis2/下載,其中其中axis2-1.4.1-bin.zip文件中包含了Axis2中全部的jar文件,以及命令工具, axis2-1.4.1-war.zip文件則用於將WebService發佈到Web容器中,網上有不少axis2教程,在這裏再也不多說。app

天氣預報調用實例:

下面的一個實例是調用天氣預報的一個例子,沒有采用wsdl生成本地代理類的方式,採用的是經過http請求直接訪問服務端點的方法:dom

步驟是:

一、利用soap向webservice endpoint進行請求,取回請求結果

二、經過dom4J解析返回的xml流,獲得所要的信息。

經過這個例子相信你們,會對」webserviice是基於soap協議」的這句話有更深入的理解,另外在使用dom4J解析xml返回流的過程當中,遇到了些麻煩,須要額外引入jaxen-1.1.1.jar包,不然程序會報org/jaxen/JaxenException的錯誤。而且在XML包含命名空間時,定位元素,須要按照xpath語法來寫。

下面是類的源代碼:

import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * 類做用調用webservice獲得天氣預報服務
 * @author qsw-Myonlystar 2010-1-13上午09:59:45
 */
public class Weather {
    /**
     * 獲取soap請求頭,並替換其中的標誌符號爲用戶的輸入符號
     * @param city 用戶輸入城市名
     * @return 用戶將要發送給服務器的soap請求
     */
    private static String getSoapRequest(String city) {
        StringBuilder sb = new StringBuilder();
        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
                        + "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
                        + "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
                        + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
                        + "<soap:Body>    <getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">"
                        + "<theCityName>" + city
                        + "</theCityName>    </getWeatherbyCityName>"
                        + "</soap:Body></soap:Envelope>");
        return sb.toString();
    }
    /**
     * 用戶把SOAP請求發送給服務器端,並返回服務器點返回的輸入流
     * @param city 用戶輸入的城市名稱
     * @return 服務器端返回的輸入流,供客戶端讀取
     * @throws Exception
     */
    public static InputStream getSoapInputStream(String city) throws Exception {
        try {
            String soap = getSoapRequest(city);
            if (soap == null) {
                return null;
            }
            URL url = new URL(
                    "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx");
            URLConnection conn = url.openConnection();
            conn.setUseCaches(false);
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-Length", Integer.toString(soap
                    .length()));
            conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
            conn.setRequestProperty("SOAPAction",
                    "http://WebXml.com.cn/getWeatherbyCityName");
            OutputStream os = conn.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
            osw.write(soap);
            osw.flush();
            osw.close();
            InputStream is = conn.getInputStream();
            //System.out.println(is.toString());
            return is;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 經過dom4j對服務器端返回的XML進行解析
     * @param city 用戶輸入的城市名稱
     * @return 符串 用,分割
     */
    public static String getWeather(String city) {
        Document document=null;
        SAXReader reader = new SAXReader();
        String s="";
        Map map=new HashMap();
        map.put("design", "http://WebXml.com.cn/");
        reader.getDocumentFactory().setXPathNamespaceURIs(map);
        try {
            InputStream is = getSoapInputStream(city);//獲得輸入流
            document=reader.read(is);//將輸入流轉化爲document
            String t=document.asXML();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        List nodes = document.selectNodes("//design:string");
        for (Iterator it = nodes.iterator(); it.hasNext();) {
            Element elm = (Element) it.next();
            String text=elm.getText();
            //System.out.println("fsffs"+text);
            s=s+elm.getText()+"\n";
        }
        return s;
    }
    /**
     * 測試函數
     * @param args
     */
    public static void main(String args[]){
        Weather w=new Weather();
        System.out.println(w.getWeather("泰安"));
    }
}

 

另外向你們推薦一個比較好的網站,http://www.webxml.com.cn/zh_cn/index.aspx。上面又不少好的webservice能夠供咱們調用。

相關文章
相關標籤/搜索