九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
WebService學(xué)習(xí)整理(一)

1 WebService基礎(chǔ)

1.1 作用

1,       WebService是兩個系統(tǒng)的遠(yuǎn)程調(diào)用,使兩個系統(tǒng)進(jìn)行數(shù)據(jù)交互,如應(yīng)用:

天氣預(yù)報服務(wù)、銀行ATM取款、使用郵箱賬號登錄各網(wǎng)站等。

2,       WebService之間的調(diào)用是跨語言的調(diào)用。Java、.Net、php,發(fā)送Http請求,使用的數(shù)據(jù)格式是XML格式。

3,       webxml.com.cn上面有一些免費的WebService服務(wù),可以進(jìn)去看看。

1.2 應(yīng)用基礎(chǔ)

4,       基礎(chǔ)概念:

(1),理解服務(wù):

現(xiàn)在的應(yīng)用程序變得越來越復(fù)雜,甚至只靠單一的應(yīng)用程序無法完成全部的工作。更別說只使用一種語言了。因此需要訪問別人寫的服務(wù),以獲得感興趣的數(shù)據(jù)。

在寫應(yīng)用程序查詢數(shù)據(jù)庫時,并沒有考慮過為什么可以將查詢結(jié)果返回給上層的應(yīng)用程序,甚至認(rèn)為,這就是數(shù)據(jù)庫應(yīng)該做的,其實不然,這是數(shù)據(jù)庫通過TCP/IP協(xié)議與另一個應(yīng)用程序進(jìn)行交流的結(jié)果,而上層是什么樣的應(yīng)用程序,是用什么語言,數(shù)據(jù)庫本身并不知道,它只知道接收到了一份協(xié)議,這就是SQL92查詢標(biāo)準(zhǔn)協(xié)議。

目前的云計算、云查殺都是一種服務(wù),現(xiàn)在比較流行的說法是SOA(面向服務(wù)的框架)。

既然數(shù)據(jù)庫可以依據(jù)某些標(biāo)準(zhǔn)對外部其他應(yīng)用程序提供服務(wù)、而且不關(guān)心對方使用什么語言,那我們?yōu)槭裁淳筒荒軐崿F(xiàn)跨平臺、跨語言的服務(wù)呢?

只要我們用Java寫的代碼,可以被任意的語言所調(diào)用,我們就實現(xiàn)了跨平臺,跨語言的服務(wù)!---WebService

因此,WebService,顧名思義就是基于Web的服務(wù)。它使用Web(HTTP)方式,接收和響應(yīng)外部系統(tǒng)的某種請求。從而實現(xiàn)遠(yuǎn)程調(diào)用.

我們可以調(diào)用互聯(lián)網(wǎng)上查詢天氣信息Web服務(wù),然后將它嵌入到我們的程序(C/S或B/S程序)當(dāng)中來,當(dāng)用戶從我們的網(wǎng)點看到天氣信息時,他會認(rèn)為我們?yōu)樗峁┝撕芏嗟男畔⒎?wù),但其實我們什么也沒有做,只是簡單調(diào)用了一下服務(wù)器上的一段代碼而已。

學(xué)習(xí)WebService可以將你的服務(wù)(一段代碼)發(fā)布到互聯(lián)網(wǎng)上讓別人去調(diào)用,也可以調(diào)用別人機(jī)器上發(fā)布的WebService,就像使用自己的代碼一樣。

(2),基礎(chǔ)概念:XML

XML Extensible Markup Language -擴(kuò)展性標(biāo)記語言

XML,用于傳輸格式化的數(shù)據(jù),是Web服務(wù)的基礎(chǔ)。

namespace-命名空間。

(3),基礎(chǔ)概念:WSDL

WSDL – WebService Description Language – Web服務(wù)描述語言。

通過XML形式說明服務(wù)在什么地方-地址。address location

通過XML形式說明服務(wù)提供什么樣的方法 – 如何調(diào)用。operation

(4),基礎(chǔ)概念:SOAP

SOAP-Simple Object Access Protocol(簡單對象訪問協(xié)議)

SOAP作為一個基于XML語言的協(xié)議用于網(wǎng)上傳輸數(shù)據(jù)。

SOAP = 在HTTP的基礎(chǔ)上+XML數(shù)據(jù)。

SOAP是基于HTTP的。

SOAP的組成如下:

Envelope – 必須的部分。以XML的根元素出現(xiàn)。

Headers – 可選的。

Body – 必須的。在body部分,包含要執(zhí)行的服務(wù)器的方法。和發(fā)送到服務(wù)器的數(shù)據(jù)。

傳遞的數(shù)據(jù)格式:

<Envelope>

<Header></Header>

<Body>

<方法名>

方法參數(shù)

</方法名>

</Body>

</Envelope>

(5),請求示例:

以下發(fā)出HTTP請求,但不同的是向服務(wù)器發(fā)送的是XML數(shù)據(jù)!

說明:(1),因為是在HTTP上發(fā)數(shù)據(jù),所以必須先遵循HTTP協(xié)議

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

(6),響應(yīng)示例:

1.3 應(yīng)用說明

1,WebService通過HTTP協(xié)議完成遠(yuǎn)程調(diào)用

(1),WebService只采用HTTP POST方式傳輸數(shù)據(jù),不使用GET方式;  -- 握手,WSDL-get,(基于soap協(xié)議,傳輸數(shù)據(jù)格式是XML)

普通http post的contentType為

application/x-www-form-urlencoded

WebService的contentType為-即在Http的基礎(chǔ)上發(fā)SOAP協(xié)議

text/xml 這是基于soap1.1協(xié)議。

application/soap+xml 這是基于soap1.2協(xié)議。

(2),WebService從數(shù)據(jù)傳輸格式上作了限定。WebService所使用的數(shù)據(jù)均是基于XML格式的。目前標(biāo)準(zhǔn)的WebService在數(shù)據(jù)格式上主要采用SOAP協(xié)議。SOAP協(xié)議實際上就是一種基于XML編碼規(guī)范的文本協(xié)議。

(3),SOAP – Simple Object Access protocol 簡單對像訪問協(xié)議。是運行在HTTP協(xié)議基礎(chǔ)之上的協(xié)議。其實就是在HTTP協(xié)議是傳輸XML文件,就變成了SOAP協(xié)議。

(4),SOAP1.1和SOAP1.2的 namespace不一樣??梢酝ㄟ^查看類

javax.xml.ws.soap.SOAPBinding來查看里面的常量

默認(rèn)情況下,Jdk1.6只支持soap1.1

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

1.4 WebService與Web的區(qū)別與聯(lián)系

可以把WebService看作是Web服務(wù)器上應(yīng)用;反過來說,Web服務(wù)器是WebService運行時所必需的容器。這就是它們的區(qū)別和聯(lián)系。

1.5 WebService的特點

WebService通過HTTP POST方式接受客戶的請求(如果基于soap協(xié)議,傳輸數(shù)據(jù)格式是XML),只能是POST方式,因為GET方式?jīng)]有請求體。

WebService與客戶端之間一般使用SOAP協(xié)議傳輸XML數(shù)據(jù).

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

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

(2)               客戶端最好發(fā)送1.1請求,而服務(wù)端最好使用1.2高版本。

2 應(yīng)用示例

2.1 發(fā)布WebService服務(wù)(使用Jdk1.6.0_21以后的版本)

1,使用Jdk1.6.0_21以后的版本發(fā)布一個WebService服務(wù)(使用注解方式)

與Web服務(wù)相關(guān)的類,都位于javax.jws.*包中。

主要類有:

@WebService - 它是一個注解,用在類上指定將此類發(fā)布成一個ws。

Endpoint – 此類為端點服務(wù)類,它的方法publish用于將一個已經(jīng)添加了@WebService注解對象綁定到一個地址的端口上。

(1)一個簡單的Java項目,HelloService

①建立如下包結(jié)構(gòu):

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

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

還需要至少提供一個可以發(fā)布的方法:(方法不能是靜態(tài)并且是非final的),只有這樣的方法才可被發(fā)布。

@WebService

public class HelloService {

public String sayHello(String name){

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

return "hello   "+name;

}

public static void main(String[] args){

//參數(shù)1:綁定服務(wù)的地址

//參數(shù)2:提供服務(wù)的實例

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

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

}

}

使用EndPoint.publish()方法將會新開啟一個線程,所以并不會影響主線程的運行,所以運行主方法時,控制臺仍然可以看到有輸出:server ready的信息。

③服務(wù)發(fā)布成功后,在客戶端調(diào)用:

啟動服務(wù)后,在瀏覽器中輸入綁定的服務(wù)地址+”?wsdl”即可查看服務(wù)的說明書。wsdl- WebService Description Language,是以XML文件形式來描述WebService的”說明書”,有了說明書,我們才可以知道如何使用或是調(diào)用這個服務(wù).

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

即可生成客戶端代碼。(包含.class文件和.java文件)

此處注意:是生成而不是下載,服務(wù)器上并沒有所生成的所有的類和方法。

⑤新建一個Java項目HelloService_Client做客戶端,將.java文件打包一起放在此項目下,調(diào)用:

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,完成客戶端的調(diào)用

說明:

wsimport是jdk自帶的,可以根據(jù)wsdl文檔生成客戶端調(diào)用代碼.當(dāng)然,無論服務(wù)器端的WebService是用什么語言寫的,都將在客戶端生成Java代碼。服務(wù)器端用什么寫的并不重要。

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

常用參數(shù)為:

-d<目錄>  - 將生成.class文件。默認(rèn)參數(shù)。

-s<目錄> - 將生成.java文件。

-p<生成的新包名> -將生成的類,放于指定的包下,自定義包結(jié)構(gòu)。

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

示例:

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后面有個小點,用于指定源代碼生成的目錄。點即當(dāng)前目錄。

如果使用了-s參數(shù)則會在目錄下生成兩份代碼,一份為.class代碼。一份為.java代碼。

.class代碼,可以經(jīng)過打包以后使用。.java代碼可以直接Copy到我們的項目中運行。

2,通過wsimport生成本地代碼,調(diào)用網(wǎng)絡(luò)上的web服務(wù),比如手機(jī)號碼歸屬地服務(wù)。

進(jìn)入xml.com.cn找到手機(jī)號碼歸屬地服務(wù)的wsdl:

復(fù)制使用wsimport命令,將生成的java代碼拷貝到MobileService項目下。

在客戶端的調(diào)用:

public static void main(String[] args) {

MobileCodeWS mc = new MobileCodeWS();

MobileCodeWSSoap soap = mc.getMobileCodeWSSoap();

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

System.out.println(str);

}

客戶端控制臺打印:

北京  聯(lián)通

說明:在WebService客戶端和服務(wù)端都使用了代理類,因此客戶端訪問服務(wù)端的是代理對象,客戶端和服務(wù)端交互時都使用代理對象。

3,使用wsimpot生成客戶端調(diào)用代碼時,若wsdl使用的是本地文件,那么生成客戶端代碼后若將wsdl本地文件刪除,則在調(diào)用過程中,會出現(xiàn)本地文件找不著的錯誤。這時候只需要將引用本地wsdl文件的代碼替換成wsdl的url地址即可。

2.2 客戶端調(diào)用WebService的方式

通過wsimport生成客戶端代碼

通過客戶端編程的方式調(diào)用

通過ajax調(diào)用 (js+XML)

通過URLConnection調(diào)用

2.2.1 通過wsimport生成客戶端代碼

參見2.1

2.2.2 通過客戶端編程的方式調(diào)用

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

(2),關(guān)鍵類Service

方法create – 用戶創(chuàng)建Service對像,提供wsdlurl和服務(wù)名。

getPort-用于通過指定namespace,portName和接口的范型。

在客戶端需要一個與服務(wù)器接口完全相同的類。(仍然使用工具生成。但只需要一個接口。并需要簡單修改。如果返回的是復(fù)雜數(shù)據(jù)類型如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

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

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

客戶端編程的方式不常用。

2.2.3 通過Ajax調(diào)用(js+XML)

(1),寫一個頁面,發(fā)送Ajax請求,請求的URL即服務(wù)的地址,請求方式是POST,另外,還需要設(shè)置請求頭,以及手動構(gòu)造請求體。

<body>

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

<input type="button" onclick="sendAjaxWS();" value="通過ajax調(diào)用webservice服務(wù)"/>

</body>

<head>

<title>通過ajax調(diào)用webservice服務(wù)</title>

<script>

var xhr;

function sendAjaxWS(){

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

//指定ws的請求地址

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

//手動構(gòu)造請求體

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);

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

//設(shè)置回調(diào)函數(shù)

xhr.onreadystatechange = _back;

//發(fā)送請求

xhr.send(requestBody);

}

//定義回調(diào)函數(shù)

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調(diào)用web服務(wù)完成不同于使用java代碼調(diào)用。所以,必須要對SOAP文件非常的了解。

一般使用ajax調(diào)用,應(yīng)該是在已經(jīng)獲知了以下信息以后才去調(diào)用:

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

獲知響應(yīng)(response)的soap文本。

請求文件和響應(yīng)文本格式,一般會隨web服務(wù)的發(fā)布一同發(fā)布。

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

2.2.4 通過URLConnection調(diào)用

1,指定WebService服務(wù)的請求地址:

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

2,創(chuàng)建URL:URL url = new URL(wsUrl);

3,建立連接,并將連接強轉(zhuǎn)為Http連接

URLConnection conn = url.openConnection();

HttpURLConnection con = (HttpURLConnection) conn;

4,設(shè)置請求方式和請求頭:

con.setDoInput(true);                  //是否有入?yún)?/p>

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

con.setRequestMethod("POST");   // 設(shè)置請求方式

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

5,// 手動構(gòu)造請求體

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,通過流的方式將請求體發(fā)送出去:

//獲得輸出流

OutputStream out = con.getOutputStream();

out.write(requestBody.getBytes());

out.close();

7,服務(wù)端返回正常:

int code = con.getResponseCode();

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

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();

}

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
干貨 | 最全Web Service滲透測試總結(jié)
NO Code直接根據(jù)Wsdl生成SOAP報文,發(fā)送http請求調(diào)用web service...
JAVA6開發(fā)WebService (一)
asp.net webService服務(wù)
基于Axis的WebService測試,開發(fā),部署
大華智慧園區(qū)前臺任意文件上傳(最新1day)
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服