国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

WebService客戶端三種調用方式整理

2019-11-08 18:41:15
字體:
來源:轉載
供稿:網友
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),基礎概念:XMLXML Extensible Markup Language -擴展性標記語言XML,用于傳輸格式化的數據,是Web服務的基礎。namespace-命名空間。(3),基礎概念:WSDLWSDL – WebService Description Language – Web服務描述語言。通過XML形式說明服務在什么地方-地址。address location通過XML形式說明服務提供什么樣的方法 – 如何調用。Operation(4),基礎概念:SOAPSOAP-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-urlencodedWebService的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的),只有這樣的方法才可被發布。@WebServicepublic 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?wsdlC:/> wsimport –s . –p com.sitech.webhttp://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.12.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、本地部分和前綴??蛻舳司幊痰姆绞讲怀S?。 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();}
上一篇:vi編輯器

下一篇:poco 簡介

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麦盖提县| 都匀市| 天峻县| 尚志市| 锡林浩特市| 望都县| 土默特左旗| 丹东市| 松江区| 沿河| 永济市| 克什克腾旗| 如皋市| 中西区| 广水市| 新余市| 靖江市| 孟津县| 台南县| 深圳市| 葵青区| 灯塔市| 安远县| 内乡县| 博客| 玛沁县| 邵武市| 邛崃市| 青浦区| 塔河县| 隆昌县| 广东省| 乌兰浩特市| 昌乐县| 陈巴尔虎旗| 林芝县| 宣化县| 乌鲁木齐市| 绥棱县| 海林市| 新沂市|