WebService學習總結

因爲最近開發的項目需求中涉及到了webservice,正好對這塊知識以前學過但是又忘記了,於是想着從新學習下,整理一個筆記,便於後面的複習。於是有了本文,下面開始介紹webservice。

一、簡介

大家或多或少都聽過 WebService(Web服務),有一段時間甚至很多計算機期刊、書籍和網站都大肆的提及和宣傳WebService技術,其中不乏很多吹噓和做廣告的成 分。但是不得不承認的是WebService真的是一門新興和有前途的技術,那麼WebService到底是什麼?何時應該用?下面將會詳細介紹,這一節我們先有一個感性認識。具體舉個例子,比如在Windows Server服務器上有個C#.Net開發的應用A,在Linux上有個Java語言開發的應用B,B應用要調用A應用,或者是互相調用。用於查看對方的業務數據。再舉個例子,天氣預報接口。無數的應用需要獲取天氣預報信息;這些應用可能是各種平臺,各種技術實現;而氣象局的項目,估計也就一兩種,要對外提供天氣預報信息,這個時候,如何解決呢?這些應用的時候的都可以通過WebService來很好的實現其應用。通過Web Service,客戶端和服務器才能夠自由的用HTTP進行通信,不論兩個程序的平臺和編程語言是什麼。當然有人會說使用Socket通信業可以達到效果,但是兩者之間還是有區別的。比如:
在這裏插入圖片描述

客戶端:

package com.pony1223;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class WeatherClient 
{
    public static void main(String[] args) throws UnknownHostException, IOException
    {
        //1.創建Socket對象,和服務端建立連接
        Socket socket = new Socket("127.0.0.1",12345);
         
        //2.發送城市名稱
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF("北京");
        System.out.println("請求查詢天氣: 北京");
         
        //3.接受返回結果使用輸入流
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String result = dis.readUTF();
        System.out.println("北京的天氣: " + result);
         
        //4.關閉流
        dis.close();
        dos.close();
    }

}

服務端:

package com.pony1223;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class WeatherServer 
{
    public static void main(String[] args) throws IOException{
         
        // 1.創建ServerSocket對象
        ServerSocket serverSocket = new ServerSocket(12345);
 
        while(true){
 
            // 2.等待客戶端連接,阻塞的方法
            final Socket socket = serverSocket.accept();
             
            Runnable runnable = new Runnable(){
                @Override
                public void run(){
                    try{
                        // 3.使用輸入流接受客戶端發送的請求
                        DataInputStream dis = new DataInputStream(socket.getInputStream());
                        String cityName = dis.readUTF();
                        System.out.println("接收到客戶端發送的請求: " + cityName);
                         
                        Thread.sleep(1000);
                         
                        // 4.根據城市名查詢天氣
                        String result = "今天天氣很熱";
                        System.out.println("返回天氣信息: " + result);
 
                        // 5.返回查詢結果,使用輸出流。
                        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                        dos.writeUTF(result);
 
                        // 6.關閉流
                        dis.close();
                        dos.close();
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
            };
             
            //啓動線程
            new Thread(runnable).start();
             
        }
    }

}

輸出結果爲:

請求查詢天氣: 北京
北京的天氣: 今天天氣很熱

接收到客戶端發送的請求: 北京
返回天氣信息: 今天天氣很熱

然後我們採用WebService來實現下:

第一步: 創建一個java工程,不需要導入jar包。
第二步: 創建接口。在Webservice中叫做SEI(wsdl中叫做PortType)。
第三步: 創建實現類。需要在實現類上加一個@Webservice註解。
第四步: 發佈服務。EndPoint.publish發佈服務。
WeatherInterface.java

package com.pony1223.wsservice;
import javax.jws.WebService;


@WebService
public interface WeatherInterface 
{
    String getWeatherByCity(String city);
}

實現類:

package com.pony1223.wsservice.impl;
import javax.jws.WebService;
import com.pony1223.wsservice.WeatherInterface;

@WebService
public class WeatherInterfaceImpl implements WeatherInterface
{

    @Override
    public String getWeatherByCity(String city) {
        System.out.println("接收客戶端發送過來的城市名字:"+city);
        //調用天氣等服務
        
        //.....
        
        //這裏模擬所以直接返回結果
        
        String result = "天氣比較冷";
        System.out.println("返回天氣查詢結果:"+result);
        return result;
    }

}

WeatherServer.java 發佈服務;

package com.pony1223.test;

import javax.xml.ws.Endpoint;

import com.pony1223.wsservice.WeatherInterface;
import com.pony1223.wsservice.impl.WeatherInterfaceImpl;

public class WeatherServer 
{
    public static void main(String[] args)
    {
        WeatherInterface server = new WeatherInterfaceImpl();
        String address = "http://192.168.31.159:1111/WeatherInterface";
        Endpoint.publish(address, server);
    }

}

看看服務是否發佈成功,訪問wsdl:http://192.168.31.159:1111/WeatherInterface?wsdl
在這裏插入圖片描述
可以看到服務發佈成功:

客戶端代碼編寫,可以採用工具生成:
在這裏插入圖片描述
在這裏插入圖片描述
因此我們只需要編寫client的調用即可:

第1步:創建服務視圖對象。
第2步: 從服務視圖中獲得PortType對象。
第3步: 調用PortType的方法(可以實現遠程通信)
第4步: 接收方法的返回值(服務端響應的結果)。

package com.pony1223.wsservice.impl;

public class Client
{
    public static void main(String[] args) 
    {
        WeatherInterfaceImplService server = new WeatherInterfaceImplService();
        WeatherInterfaceImpl impl = server.getWeatherInterfaceImplPort();
        System.out.println(impl.getWeatherByCity("北京"));
        
    }

}

輸出結果:

天氣比較冷

接收客戶端發送過來的城市名字:北京
返回天氣查詢結果:天氣比較冷

上面編寫了兩種方式,那麼區別是什麼?

(1)Socket是基於TCP/IP的傳輸層協議。
Webservice是基於HTTP協議傳輸數據,http是基於tcp的應用層協議。
Webservice採用了基於http的soap協議傳輸數據。
(2)Socket接口通過流傳輸,不支持面向對象。
Webservice 接口支持面向對象,最終webservice將對象進行序列化後通過流傳輸。
Webservice採用soap協議進行通信,不需專門針對數據流的發送和接收進行處理,是一種跨平臺的面向對象遠程調用技術。
(3)Socket適用於高性能大數據的傳輸,傳輸的數據需要手動處理,socket通信的接口協議需要自定義。
比如:自定義一種字符串拼接的格式,比如自定義的xml數據,自定義麻煩之處在接口調用方和接口服務端需要互相討論確定接口的協議內容,不方便。
缺點
程序員需要自己去解析輸入、輸出流,解析發送和接收的數據。數據傳輸的格式不固定,需要程序員開發socket接口時自定義接口協議。
優點
如果要傳輸大數據量,socket可以滿足,如果存在大併發使用socket也可以實現,程序用socket靈活性更大,比如可以socket的高併發框架mina開發。
Webservcie由於是遵循標準的soap協議,soap 協議的內容格式固定,soap協議傳遞的內容是xml數據,由於webservice是基於http的,所以簡單理解爲soap=http+xml,適用於沒有性能要求情況下且數據傳輸量小,推薦在公開接口上使用webservice,因爲soap協議的標準的。
優點
jaxws可以通過面向對象開發webservice,程序員不需要解析輸入、輸出流。
由於webservice傳輸數據使用標準的soap協議(基於http傳輸xml),soap協議已經被w3c管理了。
缺點
如果傳輸大數據量,webservice不適用。如果webservice開發大併發的應用,webservice依靠web容器提高併發數。

說明:大部分場景,WebService 已經足夠使用,所以本文的的重點是webservice.

二、WebService的本質

一句話:WebService是一種跨語言和跨平臺的遠程調用技術。

所謂跨編程語言和跨操作平臺,就是說服務端程序採用java編寫,客戶端程序則可以採用其他編程語言編寫,反之亦然!跨操作系統平臺則是指服務端程序和客戶端程序可以在不同的操作系統上運行。
所謂遠程調用,就是一臺計算機a上 的一個程序可以調用到另外一臺計算機b上的一個對象的方法,譬如,銀聯提供給商場的pos刷卡系統,商場的POS機轉賬調用的轉賬方法的代碼其實是跑在銀 行服務器上。再比如,amazon,天氣預報系統,淘寶網,校內網,百度等把自己的系統服務以webservice服務的形式暴露出來,讓第三方網站和程 序可以調用這些服務功能,這樣擴展了自己系統的市場佔有率,往大的概念上吹,就是所謂的SOA應用。
其實可以從多個角度來理解 WebService,從表面上看,WebService就是一個應用程序向外界暴露出一個能通過Web進行調用的API,也就是說能用編程的方法通過 Web來調用這個應用程序。我們把調用這個WebService的應用程序叫做客戶端,而把提供這個WebService的應用程序叫做服務端。從深層次 看,WebService是建立可互操作的分佈式應用程序的新平臺,是一個平臺,是一套標準。它定義了應用程序如何在Web上實現互操作性,你可以用任何 你喜歡的語言,在任何你喜歡的平臺上寫Web service ,只要我們可以通過Web service標準對這些服務進行查詢和訪問。
WebService平臺需要一套協議來實現分佈式應用程序的創建。任何平臺都有它的數據表示方法和類型系統。要實現互操作性,WebService平臺 必須提供一套標準的類型系統,用於溝通不同平臺、編程語言和組件模型中的不同類型系統。Web service平臺必須提供一種標準來描述 Web service,讓客戶可以得到足夠的信息來調用這個Web service。最後,我們還必須有一種方法來對這個Web service進行遠 程調用,這種方法實際是一種遠程過程調用協議(RPC)。爲了達到互操作性,這種RPC協議還必須與平臺和編程語言無關。

三、WebService的技術基礎

XML+XSD,SOAP和WSDL就是構成WebService平臺的三大技術。

3.1、XML+XSD
  WebService採用HTTP協議傳輸數據,採用XML格式封裝數據(即XML中說明調用遠程服務對象的哪個方法,傳遞的參數是什麼,以及服務對象的 返回結果是什麼)。XML是WebService平臺中表示數據的格式。除了易於建立和易於分析外,XML主要的優點在於它既是平臺無關的,又是廠商無關 的。無關性是比技術優越性更重要的:軟件廠商是不會選擇一個由競爭對手所發明的技術的。

XML解決了數據表示的問題,但它沒有定義一套標準的數據類型,更沒有說怎麼去擴展這套數據類型。例如,整形數到底代表什麼?16位,32位,64位?這 些細節對實現互操作性很重要。XML Schema(XSD)就是專門解決這個問題的一套標準。它定義了一套標準的數據類型,並給出了一種語言來擴展這套數據類型。WebService平臺就 是用XSD來作爲其數據類型系統的。當你用某種語言(如VB.NET或C#)來構造一個Web service時,爲了符合WebService標準,所 有你使用的數據類型都必須被轉換爲XSD類型。你用的工具可能已經自動幫你完成了這個轉換,但你很可能會根據你的需要修改一下轉換過程。

3.2、SOAP
WebService通過HTTP協議發送請求和接收結果時,發送的請求內容和結果內容都採用XML格式封裝,並增加了一些特定的HTTP消息頭,以說明 HTTP消息的內容格式,這些特定的HTTP消息頭和XML內容格式就是SOAP協議。SOAP提供了標準的RPC方法來調用Web Service。

SOAP協議 = HTTP協議 + XML數據格式

SOAP協議定義了SOAP消息的格式,SOAP協議是基於HTTP協議的,SOAP也是基於XML和XSD的,XML是SOAP的數據編碼方式。打個比 喻:HTTP就是普通公路,XML就是中間的綠色隔離帶和兩邊的防護欄,SOAP就是普通公路經過加隔離帶和防護欄改造過的高速公路。

3.3、WSDL
  好比我們去商店買東西,首先要知道商店裏有什麼東西可買,然後再來購買,商家的做法就是張貼廣告海報。 WebService也一樣,WebService客戶端要調用一個WebService服務,首先要有知道這個服務的地址在哪,以及這個服務裏有什麼方 法可以調用,所以,WebService務器端首先要通過一個WSDL文件來說明自己家裏有啥服務可以對外調用,服務是什麼(服務中有哪些方法,方法接受 的參數是什麼,返回值是什麼),服務的網絡地址用哪個url地址表示,服務通過什麼方式來調用。

WSDL(Web Services Description Language)就是這樣一個基於XML的語言,用於描述Web Service及其函數、參數和返回值。它是WebService客戶端和服務器端都 能理解的標準格式。因爲是基於XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的 Web service生成WSDL文檔,又能導入WSDL文檔,生成調用相應WebService的代理類代碼。

WSDL 文件保存在Web服務器上,通過一個url地址就可以訪問到它。客戶端要調用一個WebService服務之前,要知道該服務的WSDL文件的地址。 WebService服務提供商可以通過兩種方式來暴露它的WSDL文件地址:1.註冊到UDDI服務器,以便被人查找;2.直接告訴給客戶端調用者。

四、WebService知識小節

1、WebService是什麼?

1.1 基於Web的服務:服務器端整出一些資源讓客戶端應用訪問(獲取數據)

1.2 一個跨語言、跨平臺的規範(抽象)

1.3 多個跨平臺、跨語言的應用間通信整合的方案(實際)

2、爲什麼要用 Web service?

web service能解決:跨平臺調用 跨語言調用 遠程調用

3、什麼時候使用web Service?

3.1. 同一家公司的新舊應用之間

3.2. 不同公司的應用之間

3.3. 一些提供數據的內容聚合應用:天氣預報、股票行情

4、Web Service中的幾個重要術語

   4.1、WSDL(web service definition language)

WSDL是webservice定義語言, 對應.wsdl文檔, 一個webservice會對應一個唯一的wsdl文檔, 定義了客戶端與服務端發送請求和響應的數據格式和過程

   4.2、SOAP(simple object  access protocal)

SOAP是"簡單對象訪問協議"是一種簡單的、基於HTTP和XML的協議, 用於在WEB上交換結構化的數據

   soap消息:請求消息和響應消息

   4.3、SEI(WebService EndPoint Interface)

SEI是web service的終端接口,就是WebService服務器端用來處理請求的接口

   4.4、CXF(Celtix + XFire)

一個apache的用於開發webservice服務器端和客戶端的框架。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章