1. 程式人生 > >WebService客戶端三種呼叫方式整理

WebService客戶端三種呼叫方式整理

1 WebService基礎
1.1 作用
1,       WebService是兩個系統的遠端呼叫,使兩個系統進行資料互動,如應用:


天氣預報服務、銀行ATM取款、使用郵箱賬號登入各網站等。


2,       WebService之間的呼叫是跨語言的呼叫。Java、.Net、php,傳送Http請求,使用的資料格式是XML格式。


3,       webxml.com.cn上面有一些免費的WebService服務,可以進去看看。


1.2 應用基礎
4,       基礎概念:


(1),理解服務:


現在的應用程式變得越來越複雜,甚至只靠單一的應用程式無法完成全部的工作。更別說只使用一種語言了。因此需要訪問別人寫的服務,以獲得感興趣的資料。


在寫應用程式查詢資料庫時,並沒有考慮過為什麼可以將查詢結果返回給上層的應用程式,甚至認為,這就是資料庫應該做的,其實不然,這是資料庫通過TCP/IP協議與另一個應用程式進行交流的結果,而上層是什麼樣的應用程式,是用什麼語言,資料庫本身並不知道,它只知道接收到了一份協議,這就是SQL92查詢標準協議。


目前的雲端計算、雲查殺都是一種服務,現在比較流行的說法是SOA(面向服務的框架)。


既然資料庫可以依據某些標準對外部其他應用程式提供服務、而且不關心對方使用什麼語言,那我們為什麼就不能實現跨平臺、跨語言的服務呢?


只要我們用Java寫的程式碼,可以被任意的語言所呼叫,我們就實現了跨平臺,跨語言的服務!---WebService


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


我們可以呼叫網際網路上查詢天氣資訊Web服務,然後將它嵌入到我們的程式(C/S或B/S程式)當中來,當用戶從我們的網點看到天氣資訊時,他會認為我們為他提供了很多的資訊服務,但其實我們什麼也沒有做,只是簡單呼叫了一下伺服器上的一段程式碼而已。


學習WebService可以將你的服務(一段程式碼)釋出到網際網路上讓別人去呼叫,也可以呼叫別人機器上釋出的WebService,就像使用自己的程式碼一樣。


(2),基礎概念:XML


XML Extensible Markup Language -擴充套件性標記語言


XML,用於傳輸格式化的資料,是Web服務的基礎。


namespace-名稱空間。


(3),基礎概念:WSDL


WSDL – WebService Description Language – Web服務描述語言。


通過XML形式說明服務在什麼地方-地址。address location


通過XML形式說明服務提供什麼樣的方法 – 如何呼叫。operation


(4),基礎概念:SOAP


SOAP-Simple Object Access Protocol(簡單物件訪問協議)


SOAP作為一個基於XML語言的協議用於網上傳輸資料。


SOAP = 在HTTP的基礎上+XML資料。


SOAP是基於HTTP的。


SOAP的組成如下:


Envelope – 必須的部分。以XML的根元素出現。


Headers – 可選的。


Body – 必須的。在body部分,包含要執行的伺服器的方法。和傳送到伺服器的資料。


傳遞的資料格式:


<Envelope>


      <Header></Header>


      <Body>


                <方法名>


                          方法引數


        </方法名>


      </Body>


</Envelope>


(5),請求示例:


          以下發出HTTP請求,但不同的是向伺服器傳送的是XML資料!






  說明:(1),因為是在HTTP上發資料,所以必須先遵循HTTP協議


          (2),XML部分即SOAP協議,必須包含Envelope和Body元素。


(6),響應示例:






1.3 應用說明
1,WebService通過HTTP協議完成遠端呼叫


(1),WebService只採用HTTP POST方式傳輸資料,不使用GET方式;  -- 握手,WSDL-get,(基於soap協議,傳輸資料格式是XML)


普通http post的contentType為


application/x-www-form-urlencoded


WebService的contentType為-即在Http的基礎上發SOAP協議


text/xml 這是基於soap1.1協議。


application/soap+xml 這是基於soap1.2協議。


 (2),WebService從資料傳輸格式上作了限定。WebService所使用的資料均是基於XML格式的。目前標準的WebService在資料格式上主要採用SOAP協議。SOAP協議實際上就是一種基於XML編碼規範的文字協議。


 (3),SOAP – Simple Object Access protocol 簡單對像訪問協議。是執行在HTTP協議基礎之上的協議。其實就是在HTTP協議是傳輸XML檔案,就變成了SOAP協議。


 (4),SOAP1.1和SOAP1.2的 namespace不一樣。可以通過檢視類


javax.xml.ws.soap.SOAPBinding來檢視裡面的常量


預設情況下,Jdk1.6只支援soap1.1


即:@BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING)


1.4 WebService與Web的區別與聯絡
可以把WebService看作是Web伺服器上應用;反過來說,Web伺服器是WebService執行時所必需的容器。這就是它們的區別和聯絡。


 


1.5 WebService的特點
       WebService通過HTTP POST方式接受客戶的請求(如果基於soap協議,傳輸資料格式是XML),只能是POST方式,因為GET方式沒有請求體。


WebService與客戶端之間一般使用SOAP協議傳輸XML資料.


它本身就是為了跨平臺或跨語言而設計的。


(1)               SOAP1.2注意:當使用SOAP12以後,wsimport和Eclipse和WSExplorer都不可以正常使用了,必須使用cxf提供的wsdl2java工具生成原生代碼。


(2)               客戶端最好傳送1.1請求,而服務端最好使用1.2高版本。


2 應用示例
2.1 釋出WebService服務(使用Jdk1.6.0_21以後的版本)
1,使用Jdk1.6.0_21以後的版本釋出一個WebService服務(使用註解方式)


與Web服務相關的類,都位於javax.jws.*包中。


主要類有:


@WebService - 它是一個註解,用在類上指定將此類釋出成一個ws。


Endpoint – 此類為端點服務類,它的方法publish用於將一個已經添加了@WebService註解物件繫結到一個地址的埠上。


(1)一個簡單的Java專案,HelloService


①建立如下包結構:


 


 ②新建帶有main方法的類HelloService.java,並在類上加@WebService的註釋。


在類中使用EndPoint類的publish方法:


還需要至少提供一個可以釋出的方法:(方法不能是靜態並且是非final的),只有這樣的方法才可被髮布。


@WebService


public class HelloService {


     public String sayHello(String name){


          System.out.println("sayHello Called...");


          return "hello   "+name;


     }


     public static void main(String[] args){


          //引數1:繫結服務的地址


          //引數2:提供服務的例項


     Endpoint.publish("http://124.205.244.130:5678/hello", new HelloService());


          System.out.println("server ready...");


     }


}


使用EndPoint.publish()方法將會新開啟一個執行緒,所以並不會影響主執行緒的執行,所以執行主方法時,控制檯仍然可以看到有輸出:server ready的資訊。


③服務釋出成功後,在客戶端呼叫:


啟動服務後,在瀏覽器中輸入繫結的服務地址+”?wsdl”即可檢視服務的說明書。wsdl- WebService Description Language,是以XML檔案形式來描述WebService的”說明書”,有了說明書,我們才可以知道如何使用或是呼叫這個服務.


④使用wsimport –s . http://124.205.244.130:5678/hello?wsdl


即可生成客戶端程式碼。(包含.class檔案和.java檔案)


此處注意:是生成而不是下載,伺服器上並沒有所生成的所有的類和方法。


⑤新建一個Java專案HelloService_Client做客戶端,將.java檔案打包一起放在此專案下,呼叫:


public class App {


    public static void main(String[] args) {


         /**


          * wsdl:<service name = "HelloServiceService">


          */


         HelloServiceService has = new HelloServiceService();


         /**


*wsdl:<port name="HelloServicePort" bind="tns:HelloServicePortBinding">


          */


         HelloService soap = has.getHelloServicePort();


         String str= soap.sayHello("zhangan");


         System.out.println(str);


    }


}


即可在客戶端的控制檯上可見:hello   zhangsan,完成客戶端的呼叫


說明:


wsimport是jdk自帶的,可以根據wsdl文件生成客戶端呼叫程式碼.當然,無論伺服器端的WebService是用什麼語言寫的,都將在客戶端生成Java程式碼。伺服器端用什麼寫的並不重要。


wsimport.exe位於JAVA_HOME\bin目錄下.


常用引數為:


-d<目錄>  - 將生成.class檔案。預設引數。


-s<目錄> - 將生成.java檔案。


-p<生成的新包名> -將生成的類,放於指定的包下,自定義包結構。


(wsdlurl) - http://server:port/service?wsdl,必須的引數。


示例:


C:/> wsimport –s . http://192.168.0.100/one?wsdl


C:/> wsimport –s . –p com.sitech.web


http://192.168.0.100/one?wsdl


注意:-s不能分開,-s後面有個小點,用於指定原始碼生成的目錄。點即當前目錄。


如果使用了-s引數則會在目錄下生成兩份程式碼,一份為.class程式碼。一份為.java程式碼。


.class程式碼,可以經過打包以後使用。.java程式碼可以直接Copy到我們的專案中執行。


 


2,通過wsimport生成原生代碼,呼叫網路上的web服務,比如手機號碼歸屬地服務。


進入xml.com.cn找到手機號碼歸屬地服務的wsdl:


複製使用wsimport命令,將生成的java程式碼拷貝到MobileService專案下。


 


在客戶端的呼叫:


public static void main(String[] args) {


          MobileCodeWS mc = new MobileCodeWS();


          MobileCodeWSSoap soap = mc.getMobileCodeWSSoap();


          String str = soap.getMobileCodeInfo("13011286707", null);


          System.out.println(str);


}


客戶端控制檯列印:


北京  聯通


說明:在WebService客戶端和服務端都使用了代理類,因此客戶端訪問服務端的是代理物件,客戶端和服務端互動時都使用代理物件。


3,使用wsimpot生成客戶端呼叫程式碼時,若wsdl使用的是本地檔案,那麼生成客戶端程式碼後若將wsdl本地檔案刪除,則在呼叫過程中,會出現本地檔案找不著的錯誤。這時候只需要將引用本地wsdl檔案的程式碼替換成wsdl的url地址即可。


2.2 客戶端呼叫WebService的方式
通過wsimport生成客戶端程式碼


通過客戶端程式設計的方式呼叫


通過ajax呼叫 (js+XML)


通過URLConnection呼叫


2.2.1 通過wsimport生成客戶端程式碼


參見2.1


2.2.2 通過客戶端程式設計的方式呼叫


(1),使用javax.xml.ws.Service類用於訪問web服務


(2),關鍵類Service


方法create – 使用者建立Service對像,提供wsdlurl和服務名。


getPort-用於通過指定namespace,portName和介面的範型。


在客戶端需要一個與伺服器介面完全相同的類。(仍然使用工具生成。但只需要一個介面。並需要簡單修改。如果返回的是複雜資料型別如POJO,還需要將POJO一併放到專案中)。


         App.class檔案:


     Service s =


Service.create(new URL(“http://192.168.1.108:5678/hello?wsdl”),


                     new QName(targetNamespace,serviceName)


);


HelloService hs = s.getPort(portName,serviceEndpointInterface);


(注意:這裡portName=new QName(targetNamespace,portName))


String str = hs.sayHello(“Lisi”,10);


System.out.println(str);                    //列印hello Lisi


說明 :關鍵類QName – 被稱為完全限定名即:Qualified Name的縮寫。


QName 的值包含名稱空間 URI、本地部分和字首。


客戶端程式設計的方式不常用。


 


2.2.3 通過Ajax呼叫(js+XML)


(1),寫一個頁面,傳送Ajax請求,請求的URL即服務的地址,請求方式是POST,另外,還需要設定請求頭,以及手動構造請求體。


<body>


          <input type="text" id="msg" />


          <input type="button" onclick="sendAjaxWS();" value="通過ajax呼叫webservice服務"/>


</body>


 <head>


          <title>通過ajax呼叫webservice服務</title>


          <script>


               var xhr;


               function sendAjaxWS(){


                    xhr = new ActiveXObject("Microsoft.XMLHTTP");                 


                   //指定ws的請求地址


                    var wsUrl = "http://192.168.1.108:5678/hello";


                    //手動構造請求體


      var requestBody = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ' + '         xmlns:q0="http://service.itcast.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema "'+


' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+


     '<soapenv:Body><q0:sayHello><arg0>'+


document.getElementById("msg").value+'</arg0> <arg1>10</arg1> </q0:sayHello></soapenv:Body></soapenv:Envelope>';


      //開啟連線


                 xhr.open("POST",wsUrl,true);


                //重新設定請求頭       xhr.setRequestHeader("content-type","text/xml;charset=utf8");


               //設定回撥函式


                xhr.onreadystatechange = _back;


                //傳送請求


                xhr.send(requestBody);


            }


               //定義回撥函式


               function _back(){


                    if(xhr.readyState == 4){


                         if(xhr.status == 200){


                              var ret = xhr.responseXML;


                              //解析xml


                              var eles = ret.getElementsByTagName("return")[0];


                              alert(eles.text);


                         }


                    }


               }


          </script>


     </head>


由於使用ajax – js呼叫web服務完成不同於使用java程式碼呼叫。所以,必須要對SOAP檔案非常的瞭解。


一般使用ajax呼叫,應該是在已經獲知了以下資訊以後才去呼叫:


獲知請求(request)的soap文字。


獲知響應(response)的soap文字。


請求檔案和響應文字格式,一般會隨web服務的釋出一同釋出。


我們可以通過WSExplorer獲取上面兩段文字。


2.2.4 通過URLConnection呼叫


         1,指定WebService服務的請求地址:


        String wsUrl = "http:// 124.205.244.130:5678/hello";


     2,建立URL:URL url = new URL(wsUrl);


       3,建立連線,並將連線強轉為Http連線


URLConnection conn = url.openConnection();


          HttpURLConnection con = (HttpURLConnection) conn;


       4,設定請求方式和請求頭:


          con.setDoInput(true);                  //是否有入參


          con.setDoOutput(true);                //是否有出參


          con.setRequestMethod("POST");   // 設定請求方式


          con.setRequestProperty("content-type", "text/xml;charset=UTF-8");


      5,// 手動構造請求體


               String requestBody = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" "


                         + " xmlns:q0=\"http://service.itcast.cn/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema \" "


                         + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"


                         + "<soapenv:Body><q0:sayHello><arg0>lisi</arg0> <arg1>10</arg1> </q0:sayHello></soapenv:Body></soapenv:Envelope>";


   6,通過流的方式將請求體傳送出去:


         //獲得輸出流


         OutputStream out = con.getOutputStream();


         out.write(requestBody.getBytes());


         out.close();


    7,服務端返回正常:


   int code = con.getResponseCode();


       if(code == 200){//服務端返回正常


         InputStream is = con.getInputStream();


         byte[] b = new byte[1024];


         StringBuffer sb = new StringBuffer();


         int len = 0;


         while((len = is.read(b)) != -1){


             String str = new String(b,0,len,"UTF-8");


             sb.append(str);


        }


        System.out.println(sb.toString());


        is.close();


       }


       con.disconnect();


}

相關推薦

WebService客戶呼叫方式整理

1 WebService基礎 1.1 作用 1,       WebService是兩個系統的遠端呼叫,使兩個系統進行資料互動,如應用: 天氣預報服務、銀行ATM取款、使用郵箱賬號登入各網站等。 2,       WebService之間的呼叫是跨語言的呼叫。Java、.N

WebService客戶實現方式

一、釋出一個webservice服務。 /** * * 基於soap的服務 */ @WebService(name = "Login",// 定義Port名稱 serviceName = "MyService", // 修改WebService服務名稱 targetNamespa

WebService客戶(以命令方式創建)

查看 oca except user sage png host bin ESS 以命令的方式生成WebService客戶端: 創建一個Project項目,客戶端項目名稱WS_Client,在cmd界面進入JDK的bin目錄,輸入以下命令 完整格式: C:\Program

JS----直接呼叫函式與call呼叫的區別 (函式的呼叫方式介紹)

直接呼叫 直接呼叫函式是最常見 最普通的方式,直接以函式附加的物件作為呼叫者, 在函式後括號內傳入引數來呼叫函式 例如: window.alert("測試程式碼"); 其中呼叫者如果是window可以省略, 即直接alert("測試程式碼"); 以call() 方法

Spring-Boot -- RESTFUL風格的API介面的呼叫方式【測試】

專案目錄結構圖: 說明:博主所有基於學習的內容全部基於上圖中的Spring-Boot框架,專案暫時不會上傳,因為還在完善,而且內容都比較離散,都是學習中遇到哪個知識點就往裡面加,因此,我只拆分

AM335x GPIO的呼叫方式

參考:http://www.myir-tech.com/bbs/forum.php?mod=viewthread&tid=72201.核心空間中呼叫GPIO請求GPIOerr = gpio_request(30,"sample_name");設定GPIO方向gpio_

CXF的釋出方式客戶呼叫方法

先定義一個web service @WebService(targetNamespace="http://www.itfad.net/queryUser") public interface IQueryUser { String query(@WebParam(nam

java程式碼webservice客戶的兩呼叫方式

 import javax.xml.namespace.QName; import javax.xml.rpc.Call; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.Service; import

DOTNET下的呼叫webservice方式之ASP.NET呼叫方式

首先當然是開發一個webservice,我們來個簡單的計算器的實現,程式碼如下 using System; using System.Collections; using System.ComponentModel; using System.Data; using Syst

Redis的Java客戶Jedis的八呼叫方式(事務、管道、分散式)介紹

jedis是一個著名的key-value儲存系統,而作為其官方推薦的java版客戶端jedis也非常強大和穩定,支援事務、管道及有jedis自身實現的分散式。 在這裡對jedis關於事務、管道和分散式的呼叫方式做一個簡單的介紹和對比: 一、

webservice客戶呼叫方式

這一篇介紹客戶端呼叫方式 方法1)手動寫客戶端程式碼            配置環境變數:AXIS2_HOME     C:\Users\abc\Downloads\axis2-1.6.2-bin\axis2-1.6.2            path 增加 %AX

webservice客戶生成方式

IE ide lib 自動 返回 client idea pro 選項 1.idea中File-new-Project 在彈出框中選擇java選項,選擇WebServices Client, 2.選擇Use library: 在本地中找到相關的lib包使用 (1)axi

CXF 呼叫webservice客戶步驟

1、通過cxf用wsdl生成java客戶端檔案 下載apache的cxf檔案下本地,再用wsdl2java命令生成,並copy java到相應的目錄 2、客戶端程式碼 @Test public void q30100(){ //設定請求引數 DTSaleA

c#:WebService及其幾呼叫方式

之前做移動端開發,都不清楚WebService是啥東東,現在接觸c#,專案中有三處WebService呼叫,就不得不與其打交道了,最近碰上第三方介面地址更換,而自己專案因功能也需要增加WebService方法,所以瞭解了下WebService及其呼叫。

Axis2開發WebService客戶——RPC方式

package client; import javax.xml.namespace.QName; import org.apache.axis2.addressing.EndpointReference;import org.apache.axis2.client.Options;impo

grpc-服務客戶資料傳遞方式(2)

gpc服務端和客戶端的資料傳送有四種方式,客戶端啟動服務端的啟動程式碼在上篇文章已經描述,這裡將只列出關鍵實現的程式碼。 1.客戶端傳送一個物件,服務端返回一個物件 這種方式類似於傳統的Http請求資料的方式,在上篇文章有一個簡單的實現例子,在這裡不再描

eclipse生成的webservice客戶呼叫webservice介面返回值慢的問題

        最近在對接一個webservice介面的時候,為了方便直接用eclipse生成了webservice的客戶端,發現一個奇怪的問題,呼叫webservice的時候呼叫速度很快,但是返回資料很慢,每次需要5分鐘左右才能接收到服務端返回的值。奇葩就奇葩在隔了五分鐘

客戶使用axis呼叫webService服務

import javax.xml.rpc.ParameterMode; import javax.xml.rpc.ServiceException; import org.apache.axis.client.Call; import org.apache.axis.client.Service; impor

淺淡Webservice、WSDL服務訪問的方式(附案例)

http://www.cnblogs.com/yongfeng/archive/2013/01/30/2883146.html Webservice Webservice是使應用程式以與平臺和程式語言無關的方式進行相互通訊技術。 eg:站點提供訪問的資料介面:新浪微博

webservice 客戶呼叫遠端錯誤

webserice出現異常 java.lang.IllegalStateException: Could not initialize Service.         at org.codehaus.xfire.jaxws.ServiceDelegate.<init