webservice第一篇【介紹、Scoket、http調用、wsimport調用】

WebService介紹

首先咱們來談一下爲何須要學習webService這樣的一個技術吧….java

問題一

若是咱們的網站須要提供一個天氣預報這樣一個需求的話,那咱們該怎麼作?????web

天氣預報這麼一個功能並非簡單的JS組件就可以實現的,它的數據是依賴數據庫分析出來的,甚至須要衛星探測..咱們我的建站是不可能搞這麼一個數據庫的吧。數據庫

那麼既然咱們本身幹不了,咱們能夠去找別人嗎???咱們從搜索引擎搜索,能夠發現不少提供天氣預報的網站,可是它返回的是一個網頁,而咱們僅僅須要的是對應的數據編程

咱們可能就在想,咱們能不能僅僅只要它返回的數據,而並非通過加工處理後返回的網頁呢??瀏覽器

因而乎,webService就誕生了,webservice就是一個部署在Web服務器上的,它向外界暴露出一個可以經過Web進行調用的API。也就是說:當咱們想要獲取天氣預報的信息,咱們能夠調用別人寫好的service服務,咱們調用就可以獲得結果了緩存

問題二

但是咱們寫網站主流的就有好幾個平臺:Java、.net、PHP等等,那麼部署在Web服務器上的服務器也就是webserice怎麼可以就讓咱們不一樣的平臺都可以調用呢??服務器

咱們知道java、.net這樣的平臺他們語言的基本數據類型、複雜數據類型就可能不同,那麼怎麼可以實現調用的呢???markdown

來引用一段話網絡

你們在寫應用程序查詢數據庫時,並無考慮過爲何能夠將查詢結果返回給上層的應用程序,甚至認爲,這就是數據庫應該作的,其實否則,這是數據庫經過TCP/IP協議與另外一個應用程序進行交流的結果,而上層是什麼樣的應用程序,是用什麼語言,數據庫自己並不知道,它只知道接收到了一份協議,這就是SQL92查詢標準協議。框架

不管是Java、.net、PHP等等的平臺,只要是網頁開發都是能夠經過http協議來進行通訊的,而且返回的數據要是通用的話,那麼咱們早就學過這樣的一種技術【XML】

因此webservice實際上就是http+XML

這裏寫圖片描述

對webservice的理解

WebService,顧名思義就是基於Web的服務。它使用Web(HTTP)方式,接收和響應外部系統的某種請求。從而實現遠程調用.

咱們能夠調用互聯網上查詢天氣信息Web服務,而後將它嵌入到咱們的程序(C/S或B/S程序)當中來,當用戶從咱們的網點看到天氣信息時,他會認爲咱們爲他提供了不少的信息服務,但其實咱們什麼也沒有作,只是簡單調用了一下服務器上的一段代碼而已。

學習WebService能夠將你的服務(一段代碼)發佈到互聯網上讓別人去調用,也能夠調用別人機器上發佈的WebService,就像使用本身的代碼同樣.。


回顧Socket

咱們在學習Java基礎網絡編程章節已經知道了Scoket這麼一個鏈接了。

Socket服務端

public class SocketSer {

    public static void main(String[] args) throws Exception {

        ServerSocket ss = new ServerSocket(6666);
        boolean flag = true;
        while (flag) {
            //接收客戶端的請求
            System.out.println("監聽客戶端的數據:");
            Socket sc = ss.accept();
            InputStream is = sc.getInputStream();
            byte[] buffer = new byte[1024];
            int len = -1;
            len = is.read(buffer);
            String getData = new String(buffer, 0, len);
            System.out.println("從客戶端獲取的數據:" + getData);
            //業務處理 大小寫轉化
            String outPutData = getData.toUpperCase();

            //向客戶端寫數據
            OutputStream os = sc.getOutputStream();
            os.write(outPutData.getBytes("UTF-8"));

            //釋放資源
            os.close();
            is.close();
            sc.close();
        }
        ss.close();
    }

}

Socket客服端

public class SocketClient {

    public static void main(String[] args) throws Exception {
        //獲取用戶輸入的數據
        Scanner input = new Scanner(System.in);
        System.out.println("請輸入數據:");
        String inputData = input.nextLine();

        //開啓一個Socket端口
        Socket sc = new Socket("127.0.0.1", 6666);
        OutputStream os = sc.getOutputStream();
        os.write(inputData.getBytes());

        //獲取服務端回傳的數據
        InputStream is = sc.getInputStream();
        byte[] buffer = new byte[1024];
        int len = -1;
        len = is.read(buffer);
        String getData = new String(buffer, 0, len);
        System.out.println("從服務端獲取的數據:" + getData);
        //是否流
        is.close();
        os.close();
        sc.close();
    }

}

當咱們從客戶端輸入數據之後,那麼服務端就會把數據轉成是大寫

這裏寫圖片描述

這裏寫圖片描述

其實HTTP協議就是基於Socket對其進行封裝,咱們也能夠在IE瀏覽器中對其進行訪問.咱們同樣可以獲取獲得數據!

這裏寫圖片描述

這裏寫圖片描述


Scoket與HTTP簡述

這裏寫圖片描述

ISO的七層模型 : 物理層、數據鏈路層、網絡層、傳輸層、表示層、會話層、應用層

  • Socket訪問 : Socket屬於傳輸層,它是對Tcp/ip協議的實現,包含TCP/UDP,它是全部通訊協議的基礎,Http協議須要Socket支持,以Socket做爲基礎
  • Socket通訊特色:
    - 開啓端口,該通訊是 長鏈接的通訊 ,很容易被防火牆攔截,能夠經過心跳機制來實現 ,開發難度片斷
    - 傳輸的數據通常是字符串 ,可讀性不強
    - socket端口不便於推廣
    - 性能相對於其餘的通訊協議是最優的
  • Http協議訪問 :屬於應用層的協議,對Socket進行了封裝
    - 跨平臺
    - 傳數據不夠友好
    - 對第三方應用提供的服務,但願對外暴露服務接口

問題:

  • 數據封裝不夠友好 :能夠用xml封裝數據
  • 但願給第三方應用提供web方式的服務 (http + xml) = web Service

webService相關術語

  • 名詞1:XML. Extensible Markup Language -擴展性標記語言
    • XML,用於傳輸格式化的數據,是Web服務的基礎。
    • namespace-命名空間。
    • xmlns=「http://itcast.cn」 使用默認命名空間。
    • xmlns:itcast=「http://itcast.cn」使用指定名稱的命名空間。
  • 名詞2:WSDL – WebService Description Language – Web服務描述語言。
    • 經過XML形式說明服務在什麼地方-地址。
    • 經過XML形式說明服務提供什麼樣的方法 – 如何調用。
  • 名詞3:SOAP-Simple Object Access Protocol(簡單對象訪問協議)
    • SOAP做爲一個基於XML語言的協議用於有網上傳輸數據。
    • SOAP = 在HTTP的基礎上+XML數據。
    • SOAP是基於HTTP的。
    • SOAP的組成以下:
      • Envelope – 必須的部分。以XML的根元素出現。
      • Headers – 可選的。
      • Body – 必須的。在body部分,包含要執行的服務器的方法。和發送到服務器的數據。

快速入門

首先,咱們來嘗試一下調用別人寫好的webService,來體驗一把:咱們訪問http://www.webxml.com.cn/zh_cn/index.aspx

這裏寫圖片描述

進入到裏邊

這裏寫圖片描述

當咱們輸入一個號碼,它就可以查詢出咱們的手機位置信息:

咱們如今要作的就是將這個服務讓咱們本身寫的應用程序中也能夠調用,那怎麼作呢???

http-get方式訪問webservice

這裏寫圖片描述

public void get(String mobileCode ,String userID ) throws Exception{
        URL url=new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode="+mobileCode+
                "&userID="+userID);
        HttpURLConnection conn=(HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){ //結果碼=200
            InputStream is=conn.getInputStream();
            //內存流 , 
            ByteArrayOutputStream boas=new ByteArrayOutputStream();
            byte[] buffer=new byte[1024];
            int len=-1;
            while((len=is.read(buffer))!=-1){
                boas.write(buffer, 0, len);
            }
            System.out.println("GET請求獲取的數據:"+boas.toString());
            boas.close();
            is.close();
        }
    }

這裏寫圖片描述


Http-Client 框架POST請求

爲何要使用HttpClient工具:

  • 原生態的Socket基於傳輸層,如今咱們要訪問的WebService是基於HTTP的屬於應用層,因此咱們的Socket通訊要藉助HttpClient發HTTP請求,這樣格式才能匹配

HttpClient使用步驟以下:

  1. 建立 HttpClient 的實例
  2. 建立某種鏈接方法的實例,在這裏是 GetMethod。在 GetMethod 的構造函數中傳入待鏈接的地址
  3. 配置要傳輸的參數,和消息頭信息
  4. 調用第一步中建立好的實例的 execute 方法來執行第二步中建立好的 method 實例
  5. 經過response讀取字符串
  6. 釋放鏈接。不管執行方法是否成功,都必須釋放鏈接
//2.Post請求 :經過Http-Client 框架來模擬實現 Http請求
    public void post(String mobileCode ,String userID) throws Exception{

/**HttpClient訪問網絡的實現步驟: * 1. 準備一個請求客戶端:瀏覽器 * 2. 準備請求方式: GET 、POST * 3. 設置要傳遞的參數 * 4.執行請求 * 5. 獲取結果 */
        HttpClient client=new HttpClient();
        PostMethod postMethod=new PostMethod("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo");
        //3.設置請求參數
        postMethod.setParameter("mobileCode", mobileCode);
        postMethod.setParameter("userID", userID);
        //4.執行請求 ,結果碼
        int code=client.executeMethod(postMethod);
        //5. 獲取結果
        String result=postMethod.getResponseBodyAsString();
        System.out.println("Post請求的結果:"+result);
    }


    //2.Post請求 :經過Http-Client 框架來模擬實現 Http請求
    public void soap() throws Exception{

        HttpClient client=new HttpClient();
        PostMethod postMethod=new PostMethod("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx");
        //3.設置請求參數
          postMethod.setRequestBody(new FileInputStream("c:/soap.xml"));
          //修改請求的頭部
          postMethod.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
        //4.執行請求 ,結果碼
        int code=client.executeMethod(postMethod);
        System.out.println("結果碼:"+code);
        //5. 獲取結果
        String result=postMethod.getResponseBodyAsString();
        System.out.println("Post請求的結果:"+result);
    }

wsimport

上面咱們使用的是GET方式或者使用Http-Client框架來調用webservice的服務,其實這兩種方式也有弊端

  • 傳遞參數麻煩【get方式都寫在請求地址上、post方式要一個一個封裝】
  • 解析結果麻煩【根據返回的XML來解析字符串】

若是咱們能夠把整個對象傳遞進去,返回的結果更加友好的話,就好像咱們日常調用Java類同樣使用webservice就好咯

Java也提供了相似的方法,把webservice服務搞成是Java類讓咱們本身調用,既然是Java類的話,那麼咱們使用起來就很是方便了!

把webservice服務搞成是Java類讓咱們本身調用其實就是Java幫咱們生成本地代理,再經過本地代理來訪問webservice

快速入門

wsimport是Java自帶的一個命令,咱們想要使用該命令,就必須配置環境變量,而且jdk的版本最好是1.7或以上

值得注意的是:ide帶的JDK版本要和wsimport生成本地的版本一致,否則就用不了!!!

  • wsimport使用:

    • wsimport命令後面跟着的是WSDL的url路徑 語法 wsimport [opations]
    • wsdl_uri:wsdl 的統一資源標識符
    • d :指定要輸出的文件的位置
    • s :表示要解析java的源碼 ,默認解析出的是class字節碼
    • p : 指定輸出的包名

這裏寫圖片描述

首先咱們先把cmd的路徑退到桌面上:

這裏寫圖片描述

而後對WSDL文件生成本地代理

這裏寫圖片描述

這裏寫圖片描述

該本地代理其實就是一堆的字節碼文件

這裏寫圖片描述

將獲得的字節碼文件打包成jar,那麼咱們只要在項目中導入jar包,就能夠調用了!

語法

jar cvf  test.jar【jar包的名稱】 打包目錄

這裏寫圖片描述

原本我是想將本地代理的class文件生成jar包,而後導入到idea環境下,那麼直接調用就好了。但是idea總是報出找不到對應的類,找了半天也找不到,很煩呀!!!!我考慮瞭如下的幾種狀況

  • * 生成的class文件的JVM和idea下的JVM環境不匹配【後來切換了也不行】*
  • idea緩存緣由,把idea全部緩存去掉也不行
  • 生成的本地代理包名cn不行【???idea就是對cn這個包名報錯,後來我改爲自定義的包名也不行】

最後我仍是沒有找到辦法,若是知道是什麼緣由的,麻煩在評論中告訴我吧….所以此次的測試import,我就不只僅生成class字節碼文件,還生成了.java文件。我就直接使用java文件來測試了。

在zhongfucheng目錄下生成本地代理,把java源碼也帶上

這裏寫圖片描述

因而我就把java源碼複製到個人項目中,用java源碼來進行測試

這裏寫圖片描述


解析WSDL

有的同窗可能會疑問,爲啥wsimport能那麼厲害,將http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL這麼一個url生成本地代理,其實咱們看了WSDL文件就知道了。

這裏寫圖片描述

值得注意的是,本地代理僅僅是有其方法,類,並不能解析出具體的實現的。具體的操做其實仍是webservice去完成的。代理這麼一個概念就更加清晰了。

相關文章
相關標籤/搜索