国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
中華網(wǎng)校-WSDL文件詳解(上)
摘要:只要使用 WSDL,即可以真正不受語(yǔ)言與平臺(tái)限制的方式,自動(dòng)為網(wǎng)路服務(wù)產(chǎn)生 Proxy。(列印共 28 頁(yè))

 

內(nèi)容
使用 WSDL 的原因
WSDL 文件結(jié)構(gòu)
WSDL 範(fàn)例檔案
命名空間
SOAP 訊息
WSDL 類(lèi)型與訊息區(qū)段中的 XML 結(jié)構(gòu)描述
<portType> 與 <operation> 元素
<binding> 與 <operation> 元素
文件樣式繫結(jié)
<service> 與 <port> 元素
總結(jié)
資源

使用 WSDL 的原因
網(wǎng)路通訊協(xié)定之類(lèi)的標(biāo)準(zhǔn),到底是某當(dāng)權(quán)機(jī)構(gòu)強(qiáng)制施行的;或是,人們真的認(rèn)為,確實(shí)遵守的優(yōu)點(diǎn)遠(yuǎn)勝於必須付出的代價(jià)?歷來(lái)所提出的標(biāo)準(zhǔn),許多都無(wú)疾而終。有時(shí)候,從未被大眾所使用的標(biāo)準(zhǔn),法律或政府規(guī)定還是硬要使用:好比說(shuō),Ada 程式語(yǔ)言。

我相信,遵守標(biāo)準(zhǔn)所能獲得的優(yōu)點(diǎn),才是使標(biāo)準(zhǔn)普及的原因。例如,鐵路服務(wù)的重點(diǎn)是,即使不同公司所建造的列車(chē)軌道,也可以接駁在一起;也就是說(shuō),不同公司的產(chǎn)品必須能整合使用。因此,幾家廠商便共同推出了 SOAP 這個(gè)標(biāo)準(zhǔn)。WSDL (Web Services Description Language,網(wǎng)路服務(wù)描述語(yǔ)言) 可輕易將網(wǎng)路服務(wù)提供廠商與服務(wù)的使用者結(jié)合起來(lái),輕鬆獲取 SOAP 的優(yōu)點(diǎn)。不同公司所建造的列車(chē)軌道比較容易整合;畢竟,必須同意的標(biāo)準(zhǔn)不過(guò)是兩條鐵軌之間的距離而已。但對(duì)網(wǎng)路服務(wù)而言,情況則複雜得多了。首先必須取得的共識(shí)是,指定介面的標(biāo)準(zhǔn)格式。

有個(gè)論點(diǎn)一直認(rèn)為,SOAP 並不需要介面描述語(yǔ)言。若 SOAP 純粹是溝通內(nèi)容的標(biāo)準(zhǔn),那麼它需要的便是描述該內(nèi)容的語(yǔ)言。SOAP 訊息確實(shí)可傳遞類(lèi)型資訊,也因此 SOAP 允許以動(dòng)態(tài)的方式?jīng)Q定類(lèi)型。但除非知道函數(shù)的名稱(chēng)、參數(shù)、與類(lèi)型,否則根本無(wú)法正確呼叫任何函數(shù)。若不使用 WSDL,還是可以從所提供的文件或檢查線路訊息,來(lái)確定呼叫的語(yǔ)法。但這兩種方式都需要人力介入,也因此可能在過(guò)程中出現(xiàn)錯(cuò)誤。若使用 WSDL,即可以真正不受語(yǔ)言與平臺(tái)限制的方式,自動(dòng)為網(wǎng)路服務(wù)產(chǎn)生 Proxy。類(lèi)似 CORBA 或 COM 的 IDL 檔案,WSDL 檔案也是一種客戶(hù)端與伺服端之間的合約。

請(qǐng)注意,雖然 WSDL 的設(shè)計(jì)目的是,對(duì) SOAP 以外的通訊協(xié)定顯示繫結(jié);但本文的主旨則是在 HTTP 上與 SOAP 有關(guān)連的 WSDL。而且雖然目前 SOAP 的主要用途是遠(yuǎn)端程序或函數(shù)呼叫,但 WSDL 已經(jīng)可以在 SOAP 下,指定傳輸?shù)奈募?。WSDL 1.1 已經(jīng)以 Note (通知書(shū)) 的方式 (請(qǐng)參閱 http://www.w3.org/TR/wsdl.html),提交至 W3C 。

WSDL 文件結(jié)構(gòu)
若欲瞭解任何 XML 文件,區(qū)塊圖是很有助益的。下圖說(shuō)明 WSDL 的結(jié)構(gòu);它是一種 XML 文件,可顯示 WSDL 文件五個(gè)組成區(qū)段之間的關(guān)係。

WSDL 文件可分成兩個(gè)區(qū)段群組。上群組是由抽象定義 (Abstract Definitions) 所組成;而下群組則是由具體定義 (Concrete Descriptions) 所組成。抽象區(qū)段定義 SOAP 訊息的方式是,排除平臺(tái)與語(yǔ)言的限制;因此它們不含任何電腦或語(yǔ)言特有的元素。如此一來(lái),不同的網(wǎng)站皆可實(shí)作它所定義的服務(wù)。諸如序列化等網(wǎng)站特有的資訊,則交由含具體描述的下區(qū)段處理。

抽象定義
Types (類(lèi)型)
不受電腦與語(yǔ)言限制的類(lèi)型定義。
Messages (訊息)
內(nèi)含函數(shù)參數(shù) (輸入與輸出分離) 或文件描述。
PortTypes (埠類(lèi)型)
根據(jù) Messages 區(qū)段中的訊息定義,說(shuō)明函數(shù)簽章 (作業(yè)名稱(chēng)、輸入?yún)?shù)、輸出參數(shù))。
具體定義
Bindings (繫結(jié))
在 PortTypes 區(qū)段中,指定每個(gè)作業(yè)的繫結(jié)。
Services (服務(wù))
指定每個(gè)繫結(jié)的傳輸埠位址。
在下圖中,箭頭連接代表,在文件的不同區(qū)段之間有關(guān)聯(lián)性存在。點(diǎn)與箭頭連接代表「參照」或「使用」關(guān)係。雙箭頭連接代表「修改 (modifier)」關(guān)係。3-D 箭頭連接代表「包含 (contains)」關(guān)係。因此,Messages 區(qū)段使用 Types 區(qū)段的定義;PortTypes 區(qū)段使用 Messages 區(qū)段的定義;Bindings 區(qū)段參照 PortTypes 區(qū)段;Services 區(qū)段參照 Bindings 區(qū)段。PortTypes 與 Bindings 區(qū)段內(nèi)含作業(yè)元素,而 Services 區(qū)段則內(nèi)含埠元素。Bindings 區(qū)段中的作業(yè)元素,會(huì)修改或進(jìn)一步說(shuō)明 PortTypes 區(qū)段中的作業(yè)元素。

以此為基礎(chǔ),本文將使用標(biāo)準(zhǔn) XML 技術(shù),說(shuō)明 WSDL 文件?!冈亍挂辉~是指 XML 元素,而「屬性」一詞則是指元素屬性。因此:

<element attribute="attribute-value">contents</element>

內(nèi)容可以遞迴的方式,由一個(gè)以上的元素組成。根元素是最頂端的元素,文件中其它所有元素皆歸在其下。子元素永遠(yuǎn)附屬於其它的父元素。

請(qǐng)注意,只可以有一個(gè) Types 區(qū)段,甚或根本沒(méi)有此區(qū)段。其它所有區(qū)段可以有零、一、或多個(gè)父元素。例如,Messages 區(qū)段可以有零、或多個(gè) <message> 元素。WSDL 結(jié)構(gòu)描述規(guī)定,所有區(qū)段必須依指定順序排列:匯入、類(lèi)型、訊息、portType、繫結(jié)、與服務(wù)。每個(gè)抽象區(qū)段可能各自位於不同的檔案,並分別匯入至主文件中。


[圖 1] 抽象與具體定義

WSDL 範(fàn)例檔案
現(xiàn)在請(qǐng)一同深入探討 WSDL 範(fàn)例檔案,以檢視其結(jié)構(gòu)與運(yùn)作方式。請(qǐng)記得這是一個(gè)非常簡(jiǎn)單的 WSDL 文件範(fàn)例。其目的僅在解說(shuō)最明顯的功能。下列各區(qū)段皆有更詳實(shí)的討論。

<?xml version="1.0" encoding="UTF-8" ?>
<definitions name="FooSample"
targetNamespace="http://tempuri.org/wsdl/"
xmlns:wsdlns="http://tempuri.org/wsdl/"
xmlns:typens="http://tempuri.org/xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:stk="http://schemas.microsoft.com/soap-toolkit/wsdl-extension"
xmlns="http://schemas.xmlsoap.org/wsdl/">

<types>
<schema targetNamespace="http://tempuri.org/xsd"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
elementFormDefault="qualified" >
</schema>
</types>

<message name="Simple.foo">
<part name="arg" type="xsd:int"/>
</message>

<message name="Simple.fooResponse">
<part name="result" type="xsd:int"/>
</message>

<portType name="SimplePortType">
<operation name="foo" parameterOrder="arg" >
<input message="wsdlns:Simple.foo"/>
<output message="wsdlns:Simple.fooResponse"/>
</operation>
</portType>

<binding name="SimpleBinding" type="wsdlns:SimplePortType">
<stk:binding preferredEncoding="UTF-8" />
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="foo">
<soap:operation
soapAction="http://tempuri.org/action/Simple.foo"/>
<input>
<soap:body use="encoded" namespace="http://tempuri.org/message/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="http://tempuri.org/message/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>

<service name="FOOSAMPLEService">
<port name="SimplePort" binding="wsdlns:SimpleBinding">
<soap:address location="http://carlos:8080/FooSample/FooSample.asp"/>
</port>
</service>
</definitions>

下列為此範(fàn)例文件的大略說(shuō)明。稍後,會(huì)就每個(gè)區(qū)段詳細(xì)討論。

第一行宣告,本文件為 XML。雖然非是必要,但它可協(xié)助 XML 剖析器決定,應(yīng)該剖析此 WSDL 檔案,或發(fā)出錯(cuò)誤訊號(hào)。第二行是 WSDL 文件中的根元素:<definitions>。有幾個(gè)命名空間屬性 (命名空間宣告),附屬於此根元素以及 <types> 元素的 <schema> 子元素中。

<types> 元素是由 Types 區(qū)段組成。若無(wú)資料類(lèi)型須要宣告,則此區(qū)段可以省略。在範(fàn)例 WSDL 中,並無(wú)應(yīng)用程式專(zhuān)屬的類(lèi)型須要宣告,但還是使用 Types 區(qū)段,以宣告本文件中結(jié)構(gòu)描述的命名空間。

 

<message> 元素是由 Messages 區(qū)段所組成。若將作業(yè)視為函數(shù),則 <message> 元素可將參數(shù)定義至該函數(shù)。<message> 元素中的每個(gè) <part> 子元素,都對(duì)應(yīng)一個(gè)參數(shù)。請(qǐng)將參數(shù)定義輸入至單一的 <message> 元素之中,並與位於自己 <message> 元素中的輸出參數(shù)分開(kāi)。同時(shí)是輸入與輸出的參數(shù),在輸入與輸出 <message> 元素中,各有與自己相對(duì)應(yīng)的 <part> 元素。根據(jù)慣例,輸出 <message> 元素的名稱(chēng),如同「fooResponse」,會(huì)以「Response」結(jié)束。如同函數(shù)參數(shù)需有名稱(chēng)與類(lèi)型一樣,每個(gè) <part> 元素也都有名稱(chēng)與類(lèi)型屬性。

若用於文件交換,WSDL 可使用 <message> 元素,說(shuō)明交換的文件。

<part> 元素的類(lèi)型可以是,XSD 基礎(chǔ)類(lèi)型、SOAP 定義類(lèi)型 (soapenc)、WSDL 定義類(lèi)型 (wsdl)、或 Types 區(qū)段的定義類(lèi)型。

在 PortTypes 區(qū)段中,可以有零、一、或更多個(gè) <portType> 元素。由於抽象的 PortType 定義,可置於不同的檔案中;因此在 WSDL 檔案中,可以有零個(gè) <portType> 元素。在上面的範(fàn)例中,即只有一個(gè) <portType> 元素。誠(chéng)如所見(jiàn),<portType> 元素可在 <operation> 元素中,定義一或多個(gè)作業(yè)。此範(fàn)例僅顯示一個(gè)名為「foo」的 <operation> 元素。此名稱(chēng)應(yīng)與函數(shù)名稱(chēng)相同。<operation> 元素可有一、二、或三個(gè)子元素:即 <input>、<output> 與 <fault> 元素。每個(gè) <input> 與 <output> 元素中的訊息屬性,都會(huì)參照 Messages 區(qū)段中的相關(guān) <message> 元素。因此,範(fàn)例中的整個(gè) <portType> 元素,相當(dāng)於下列的 C 函數(shù)宣告:

int foo(int arg);

此範(fàn)例正足以說(shuō)明,相較於 C,XML 是多麼冗長(zhǎng)的語(yǔ)言。 (包括 <message> 元素在內(nèi),此範(fàn)例共使用 12 行的 XML 進(jìn)行函數(shù)宣告;而相同的動(dòng)作, C 只要一行即可。)

Bindings 區(qū)段可有零、一或多個(gè) <binding> 元素。而其目的則是,指定每個(gè) <operation> 呼叫與回應(yīng),在線上傳送的方式。Services 區(qū)段也可有零、一或多個(gè) <service> 元素。它所含的 <port> 元素,每個(gè)都參照 Bindings 區(qū)段中的一個(gè) <binding> 元素。Bindings 與 Services 區(qū)段都是由,WSDL 文件的具體描述所組成。

命名空間
在根元素 <definitions> 與子元素 <schema> 中,都有命名空間屬性:

<definitions name="FooSample"
targetNamespace="http://tempuri.org/wsdl/"
xmlns:wsdlns="http://tempuri.org/wsdl/"
xmlns:typens="http://tempuri.org/xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:stk="http://schemas.microsoft.com/soap-toolkit/wsdl-extension"
xmlns="http://schemas.xmlsoap.org/wsdl/">

<types>
<schema targetNamespace="http://tempuri.org/xsd"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
elementFormDefault="qualified" >
</schema>
</types>

每個(gè)命名空間屬性,都會(huì)為命名空間宣告一個(gè)速記法,以便在文件中使用。例如,「xmlns:xsd」可定義一個(gè)速記法 (xsd),代表命名空間 http://www.w3.org/2001/XMLSchema。如此一來(lái),稍後即可在文件中參照此命名空間;其方式很簡(jiǎn)單,只要在名稱(chēng)前嵌入字首「xsd」,則「xsd:int」即成為合格的類(lèi)型名稱(chēng)。一般的領(lǐng)域設(shè)定規(guī)則,皆可套用至此速記字首。也就是說(shuō),在一個(gè)元素中所定義的字首,僅在該元素中使用。

使用命名空間的原因何在?命名空間的目的在避免命名衝突。若我建立了一個(gè)網(wǎng)路服務(wù),其 WSDL 檔案中含有一個(gè)名為「foo」的元素,而您想要將我的網(wǎng)路服務(wù),與另一個(gè)互補(bǔ)性的服務(wù)結(jié)合起來(lái)使用;假若沒(méi)有使用命名空間,則另一個(gè)網(wǎng)路服務(wù),在其 WSDL 檔案中,便絕對(duì)不能使用「foo」這個(gè)名稱(chēng)。除非在兩者的執(zhí)行個(gè)體中,都是指完全相同的東西,否則這兩個(gè)服務(wù)不可以使用相同的名稱(chēng)。但若使用兩個(gè)不同的命名空間,則我網(wǎng)路服務(wù)的「foo」所代表的意義,便與另一個(gè)網(wǎng)路服務(wù)的「foo」不同。在客戶(hù)端,您便必須以嵌入字首 (prefixing 或 qualifying) 的方式,參照我的「foo」。例如,若我宣告 http://www.infotects.com/fooService 的速記法是 carlos,則 http://www.infotects.com/fooService#foo 這個(gè)完全合格的名稱(chēng),可以等於「carlos:foo」。請(qǐng)注意,若使用 URI 作為命名空間,不但可確保其獨(dú)特性,更可允許在文件中使用定址器。URI 所指向的位址,不必對(duì)應(yīng)真正的網(wǎng)路位址。也可以使用 GUID 代替或補(bǔ)充 URI。例如,GUID「335DB901-D44A-11D4-A96E-0080AD76435D」即是個(gè)有效的命名空間指示項(xiàng)。

元素中所宣告的所有名稱(chēng),都附屬於 targetNamespace 屬性所宣告的命名空間之下。在 WSDL 範(fàn)例檔案中,代表 <definitions> 的 targetNamespace 是 http://tempuri.org/wsdl。它所代表的意義是,在此 WSDL 文件中宣告的所有名稱(chēng),都附屬於此命名空間。由於 <schema> 元素有它自己的 targetNamespace 屬性,且其值為 http://tempuri.org/xsd;所以在此 <schema> 元素中定義的所有名稱(chēng),都是屬於此命名空間,而不屬於主目標(biāo)命名空間。

下一行程式碼位於 <schema> 元素中,它所宣告的是預(yù)設(shè)的命名空間。結(jié)構(gòu)中所有無(wú)嵌入字首 (unqualified ) 的名稱(chēng),都屬於此命名空間。

xmlns="http://www.w3.org/2001/XMLSchema"

SOAP 訊息
對(duì)使用 WSDL 檔案的客戶(hù)端與伺服端而言,它所代表的意義之一是,可決定線上傳送的內(nèi)容。雖然 SOAP 使用的是,諸如 IP 與 HTTP 等低層次的通訊協(xié)定,但此應(yīng)用程式卻可決定,特定客戶(hù)端與特定伺服端之間所使用的高層次通訊協(xié)定。換句話(huà)說(shuō),若以「echoInt」作業(yè)為例,使用回波傳回輸入整數(shù),則參數(shù)總計(jì)、每個(gè)參數(shù)的類(lèi)型、與參數(shù)傳過(guò)線路的方式 (序列化) 等,便會(huì)構(gòu)成一個(gè)應(yīng)用程式特有的通訊協(xié)定。指定這類(lèi)通訊協(xié)定的方式很多,但我認(rèn)為使用 WSDL 才是最佳的方式。若就此觀點(diǎn)而言,WSDL 便不只是一種「介面合約」,它更是一種通訊協(xié)定指定語(yǔ)言。若超出了諸如 IP 與 HTTP 等固定通訊協(xié)定的範(fàn)圍,進(jìn)入應(yīng)用程式專(zhuān)屬通訊協(xié)定的領(lǐng)域,WSDL 正好符合我們所需。

WSDL 可以指定,SOAP 訊息是否符合 rpc 或文件樣式。正如範(fàn)例中所使用的一樣,rpc 樣式訊息的外觀就像是,一個(gè)有零或多個(gè)參數(shù)的函數(shù)呼叫。文件樣式訊息則較扁平 (flatter) 且不需要那麼多的巢狀階層。下列 XML 訊息的傳送與接收,是使用 MS SOAP Toolkit 2.0 (MSTK2) 的 SoapClient 物件,剖析 WSDL 範(fàn)例檔案的結(jié)果。

自客戶(hù)端執(zhí)行函數(shù)呼叫「foo(5131953)」:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<m:foo xmlns:m="http://tempuri.org/message/">
<arg>5131953</arg>
</m:foo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

伺服端所接收到的 (回應(yīng)):

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAPSDK1:fooResponse xmlns:SOAPSDK1="http://tempuri.org/message/">
<result>5131953</result>
</SOAPSDK1:fooResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

此函數(shù)呼叫訊息與其回應(yīng),都是正確有效的 XML。SOAP 訊息是由 <Envelope> 元素所組成,其中含有一個(gè)選擇性的 <Hpes> 元素是由 Types 區(qū)段組成。若無(wú)資料類(lèi)型須要宣告,則此區(qū)段可以省略。在範(fàn)例 WSDL 中,並無(wú)應(yīng)用程式專(zhuān)屬的類(lèi)型須要宣告,但還是使用 Types 區(qū)段,以宣告本文件中結(jié)構(gòu)描述的命名空間。

 

<message> 元素是由 Messages 區(qū)段所組成。若將作業(yè)視為函數(shù),則 <message> 元素可將參數(shù)定義至該函數(shù)。<message> 元素中的每個(gè) <part> 子元素,都對(duì)應(yīng)一個(gè)參數(shù)。請(qǐng)將參數(shù)定義輸入至單一的 <message> 元素之中,並與位於自己 <message> 元素中的輸出參數(shù)分開(kāi)。同時(shí)是輸入與輸出的參數(shù),在輸入與輸出 <message> 元素中,各有與自己相對(duì)應(yīng)的 <part> 元素。根據(jù)慣例,輸出 <message> 元素的名稱(chēng),如同「fooResponse」,會(huì)以「Response」結(jié)束。如同函數(shù)參數(shù)需有名稱(chēng)與類(lèi)型一樣,每個(gè) <part> 元素也都有名稱(chēng)與類(lèi)型屬性。

若用於文件交換,WSDL 可使用 <message> 元素,說(shuō)明交換的文件。

<part> 元素的類(lèi)型可以是,XSD 基礎(chǔ)類(lèi)型、SOAP 定義類(lèi)型 (soapenc)、WSDL 定義類(lèi)型 (wsdl)、或 Types 區(qū)段的定義類(lèi)型。

在 PortTypes 區(qū)段中,可以有零、一、或更多個(gè) <portType> 元素。由於抽象的 PortType 定義,可置於不同的檔案中;因此在 WSDL 檔案中,可以有零個(gè) <portType> 元素。在上面的範(fàn)例中,即只有一個(gè) <portType> 元素。誠(chéng)如所見(jiàn),<portType> 元素可在 <operation> 元素中,定義一或多個(gè)作業(yè)。此範(fàn)例僅顯示一個(gè)名為「foo」的 <operation> 元素。此名稱(chēng)應(yīng)與函數(shù)名稱(chēng)相同。<operation> 元素可有一、二、或三個(gè)子元素:即 <input>、<output> 與 <fault> 元素。每個(gè) <input> 與 <output> 元素中的訊息屬性,都會(huì)參照 Messages 區(qū)段中的相關(guān) <message> 元素。因此,範(fàn)例中的整個(gè) <portType> 元素,相當(dāng)於下列的 C 函數(shù)宣告:

int foo(int arg);

此範(fàn)例正足以說(shuō)明,相較於 C,XML 是多麼冗長(zhǎng)的語(yǔ)言。 (包括 <message> 元素在內(nèi),此範(fàn)例共使用 12 行的 XML 進(jìn)行函數(shù)宣告;而相同的動(dòng)作, C 只要一行即可。)

Bindings 區(qū)段可有零、一或多個(gè) <binding> 元素。而其目的則是,指定每個(gè) <operation> 呼叫與回應(yīng),在線上傳送的方式。Services 區(qū)段也可有零、一或多個(gè) <service> 元素。它所含的 <port> 元素,每個(gè)都參照 Bindings 區(qū)段中的一個(gè) <binding> 元素。Bindings 與 Services 區(qū)段都是由,WSDL 文件的具體描述所組成。

命名空間
在根元素 <definitions> 與子元素 <schema> 中,都有命名空間屬性:

<definitions name="FooSample"
targetNamespace="http://tempuri.org/wsdl/"
xmlns:wsdlns="http://tempuri.org/wsdl/"
xmlns:typens="http://tempuri.org/xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:stk="http://schemas.microsoft.com/soap-toolkit/wsdl-extension"
xmlns="http://schemas.xmlsoap.org/wsdl/">

<types>
<schema targetNamespace="http://tempuri.org/xsd"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
elementFormDefault="qualified" >
</schema>
</types>

每個(gè)命名空間屬性,都會(huì)為命名空間宣告一個(gè)速記法,以便在文件中使用。例如,「xmlns:xsd」可定義一個(gè)速記法 (xsd),代表命名空間 http://www.w3.org/2001/XMLSchema。如此一來(lái),稍後即可在文件中參照此命名空間;其方式很簡(jiǎn)單,只要在名稱(chēng)前嵌入字首「xsd」,則「xsd:int」即成為合格的類(lèi)型名稱(chēng)。一般的領(lǐng)域設(shè)定規(guī)則,皆可套用至此速記字首。也就是說(shuō),在一個(gè)元素中所定義的字首,僅在該元素中使用。

使用命名空間的原因何在?命名空間的目的在避免命名衝突。若我建立了一個(gè)網(wǎng)路服務(wù),其 WSDL 檔案中含有一個(gè)名為「foo」的元素,而您想要將我的網(wǎng)路服務(wù),與另一個(gè)互補(bǔ)性的服務(wù)結(jié)合起來(lái)使用;假若沒(méi)有使用命名空間,則另一個(gè)網(wǎng)路服務(wù),在其 WSDL 檔案中,便絕對(duì)不能使用「foo」這個(gè)名稱(chēng)。除非在兩者的執(zhí)行個(gè)體中,都是指完全相同的東西,否則這兩個(gè)服務(wù)不可以使用相同的名稱(chēng)。但若使用兩個(gè)不同的命名空間,則我網(wǎng)路服務(wù)的「foo」所代表的意義,便與另一個(gè)網(wǎng)路服務(wù)的「foo」不同。在客戶(hù)端,您便必須以嵌入字首 (prefixing 或 qualifying) 的方式,參照我的「foo」。例如,若我宣告 http://www.infotects.com/fooService 的速記法是 carlos,則 http://www.infotects.com/fooService#foo 這個(gè)完全合格的名稱(chēng),可以等於「carlos:foo」。請(qǐng)注意,若使用 URI 作為命名空間,不但可確保其獨(dú)特性,更可允許在文件中使用定址器。URI 所指向的位址,不必對(duì)應(yīng)真正的網(wǎng)路位址。也可以使用 GUID 代替或補(bǔ)充 URI。例如,GUID「335DB901-D44A-11D4-A96E-0080AD76435D」即是個(gè)有效的命名空間指示項(xiàng)。

元素中所宣告的所有名稱(chēng),都附屬於 targetNamespace 屬性所宣告的命名空間之下。在 WSDL 範(fàn)例檔案中,代表 <definitions> 的 targetNamespace 是 http://tempuri.org/wsdl。它所代表的意義是,在此 WSDL 文件中宣告的所有名稱(chēng),都附屬於此命名空間。由於 <schema> 元素有它自己的 targetNamespace 屬性,且其值為 http://tempuri.org/xsd;所以在此 <schema> 元素中定義的所有名稱(chēng),都是屬於此命名空間,而不屬於主目標(biāo)命名空間。

下一行程式碼位於 <schema> 元素中,它所宣告的是預(yù)設(shè)的命名空間。結(jié)構(gòu)中所有無(wú)嵌入字首 (unqualified ) 的名稱(chēng),都屬於此命名空間。

xmlns="http://www.w3.org/2001/XMLSchema"

SOAP 訊息
對(duì)使用 WSDL 檔案的客戶(hù)端與伺服端而言,它所代表的意義之一是,可決定線上傳送的內(nèi)容。雖然 SOAP 使用的是,諸如 IP 與 HTTP 等低層次的通訊協(xié)定,但此應(yīng)用程式卻可決定,特定客戶(hù)端與特定伺服端之間所使用的高層次通訊協(xié)定。換句話(huà)說(shuō),若以「echoInt」作業(yè)為例,使用回波傳回輸入整數(shù),則參數(shù)總計(jì)、每個(gè)參數(shù)的類(lèi)型、與參數(shù)傳過(guò)線路的方式 (序列化) 等,便會(huì)構(gòu)成一個(gè)應(yīng)用程式特有的通訊協(xié)定。指定這類(lèi)通訊協(xié)定的方式很多,但我認(rèn)為使用 WSDL 才是最佳的方式。若就此觀點(diǎn)而言,WSDL 便不只是一種「介面合約」,它更是一種通訊協(xié)定指定語(yǔ)言。若超出了諸如 IP 與 HTTP 等固定通訊協(xié)定的範(fàn)圍,進(jìn)入應(yīng)用程式專(zhuān)屬通訊協(xié)定的領(lǐng)域,WSDL 正好符合我們所需。

WSDL 可以指定,SOAP 訊息是否符合 rpc 或文件樣式。正如範(fàn)例中所使用的一樣,rpc 樣式訊息的外觀就像是,一個(gè)有零或多個(gè)參數(shù)的函數(shù)呼叫。文件樣式訊息則較扁平 (flatter) 且不需要那麼多的巢狀階層。下列 XML 訊息的傳送與接收,是使用 MS SOAP Toolkit 2.0 (MSTK2) 的 SoapClient 物件,剖析 WSDL 範(fàn)例檔案的結(jié)果。

自客戶(hù)端執(zhí)行函數(shù)呼叫「foo(5131953)」:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<m:foo xmlns:m="http://tempuri.org/message/">
<arg>5131953</arg>
</m:foo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

伺服端所接收到的 (回應(yīng)):

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAPSDK1:fooResponse xmlns:SOAPSDK1="http://tempuri.org/message/">
<result>5131953</result>
</SOAPSDK1:fooResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

此函數(shù)呼叫訊息與其回應(yīng),都是正確有效的 XML。SOAP 訊息是由 <Envelope> 元素所組成,其中含有一個(gè)選擇性的 <Header> 元素,與至少一個(gè)的 <body> 元素。傳送與接收訊息兩者,在主 <Envelope> 元素中,都有只一個(gè) <Body> 元素。rpc 函數(shù)呼叫訊息的主體,有一個(gè)依作業(yè)名稱(chēng)「foo」命名的元素,而回應(yīng)主體中則有一個(gè)名為「fooResponse」元素。這個(gè) foo 元素有個(gè)如範(fàn)例 WSDL 所示的單一引數(shù),其名稱(chēng)為 <arg>。同樣地,fooResponse 也有一個(gè) <result>。在此處重複出現(xiàn)的 WSDL Bindings 區(qū)段中,請(qǐng)注意 encodingStyle、信封、與訊息命名空間的指定方式。

 

<binding name="SimpleBinding" type="wsdlns:SimplePortType">
<stk:binding preferredEncoding="UTF-8" />
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="foo">
<soap:operation
soapAction="http://tempuri.org/action/Simple.foo"/>
<input>
<soap:body use="encoded"
namespace="http://tempuri.org/message/"
encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded"
namespace="http://tempuri.org/message/"
encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
(二)基于PHP——簡(jiǎn)單的WSDL的創(chuàng)建(WSDL篇)
Web Service基礎(chǔ)(WSDL、SOAP)
【原創(chuàng)】用Visual C 客戶(hù)端調(diào)用Weblogic的Webservice
CXF + Spring 開(kāi)發(fā) Webservices
使用Soap消息調(diào)用Web Services
php生成wsdl文件方法總結(jié)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服