1. 程式人生 > >php學習之道:WSDL詳解(一)

php學習之道:WSDL詳解(一)

WSDL文件使用web服務描述語言來定義服務。

文件包括邏輯(抽象)部分和具體部分。

抽象部分用於定義獨立於實現的資料型別和訊息,具體部分定義一個endpoint如何實現一個可以與外界進行互動的服務。

通常建議在寫程式碼前定義WSDL文件和XML schema,但是這就要求對WSDL非常熟悉。

邏輯部分:

包括types,message以及portType元素。types元素中,xml schema用來定義組成訊息的資料的結構。一定數量的訊息元素用來定義服務所用訊息的格式。portType元素包括一個或多個operation元素,用來定義被operation傳送的訊息。

具體部分:

包括binding和service元素。binding元素描述message元素描述的那些資料單元如何對映到一個具體的資料格式。Service元素包括一個或多個port元素,這些port元素用於定義endpoint。

總體上來說,一個WSDL文件有以下元素組成:

  • definitions--WSDL文件的根元素,該元素的屬性指明瞭wsdl文件的名稱,文件的目標名字空間,以及WSDL文件應用的名字空間的速記定義。
  • types--資料單元的xml樣式定義,形成了服務所用訊息的構建塊。
  • portType---描述服務邏輯介面的operation元素的集合。
  • operation--一個服務包含的操作的描述,當操作被呼叫時,操作被定義為兩個endpoint之間的訊息傳遞。
  • binding---一個endpoint的實際資料格式說明,一個binding元素定義如何將一個抽象訊息對映到一個具體資料格式。該元素指明諸如引數順序,返回值等資訊。
  • service---相關port元素的集合,這些元素被庫藏,使用者組織endpoint定義。
  • port--通過binding和實體地址定義的endpoint,這個元素將所有抽象定義聚集在一起。

設計一個WSDL的步驟:

1.定義服務用到的data types

2.定義服務用到的訊息

3.定義服務介面

4.定義訊息與介面之間的bindings和線上資料的具體呈現方式

5.定義每個服務的傳輸細節。

下面根據每步展開論述:

1.定義邏輯資料單元

   定義一個服務時,第一件事情,你必須考慮的是作為暴露到外部的引數所用到的資料,將怎樣呈現。與那些是選用固定資料結構編碼的程式不同,服務必須定義出他們的資料以邏輯單元的形式,這包括兩步:

  1.1將資料拆分成邏輯單元,這些單元能被對映為資料型別,並被服務的物理實現所引用。

       如果你定義了一個服務介面,並且該介面已經實現,你必須將實現操作的資料型別轉換成xml元素,用於組裝成訊息。如果你從頭開始,你必須定義你的訊息構建時用到的構建塊,這樣的話,他們從實施角度看才有意義。

      注1:定義服務資料單元可用的型別體系:根據WSDL規範,你可以使用任何型別體系。然而在W3C規範中定義的XML schema是首選的規範的型別體系。因此,XML架構在Apache CXF的內在型別系統。

     注2:xml schema:xml schema被用來定義一個xml文件如何構建,用於定義一個文件由哪些元素組成。這些元素可以使用xml schema型別,比如xsd:int的或者他可以使用使用者定義的型別,使用者定義型別也是使用xml元素的組合來構建的餓,或者他們是用嚴格的已存在型別構建。通過結合型別定義和元素定義,你可以建立複雜的XML文件可以包含複雜的資料。當定義服務使用的資料單元時,你可以定義他們作為型別,這些型別指明訊息組成部分的結構,你也能夠定義你的訊息單元作為組成訊息結構的元素。

    注3:生成資料單元的考慮:你可以考慮簡單地生成邏輯資料單元,這些單元直接對映你在服務中使用的資料型別。當以這個方式工作時,必須緊密遵循構建RPC型別應用程式的構建模型,這不是構建面向服務架構程式必須的策略。webservice組織提供了一定數量的手冊來定義資料單元,另外W3C也提供了下main的手冊來教你如何使用xml schema展現資料型別。

  1.2將資料單元(data units)新增到文件

       依賴於你如何選擇去生成WSDL文件,生成新的資料定義要求有大量的知識,CXF GUI工具提供一定數量的幫助來描述資料型別。其他的xml編輯器提供不同級別的幫助。不論你選擇哪種編輯器,擁有一些與文件相關的知識是很重要的。

       定義WSDL中用到的資料,需以下步驟:

       a.確定介面要用到的所有資料單元

       b.在文件中生成一個types元素。

       c.建立一個schema元素,作為types元素的子元素

       d.complex型別是元素的集合,使用complexType元素來定義資料型別

       e.對於每個陣列來說,定義他的資料型別也使用complexType元素

       f.對於每個複雜型別來說,都可以從簡單型別衍生出來,定義資料局型別可以通過simpleType元素。

       g.對於每個列舉型別,定義資料型別使用simpleType元素。

       h.對於每個元素來說,定義他們使用element元素。

1.3 xml Schema simple types:

       如果一個訊息元件是簡單型別的話,那麼就不需要給他定義一個型別。介面使用的複雜型別也是通過簡單型別定義的。

      注1:輸入簡單型別:xml簡單型別是主要的放置元素,在element元素中。簡單型別也被使用在restriction元素和extension元素的base屬性中。簡單型別總是使用xsd作為字首,例如,為了指明型別int,你將輸入xsd:int在type屬性中。

<element name="simpleInt" type="xsd:int" />

    CXF支援下列xml schema簡單型別:xsd:string,xsd:normalizedString,xsd:int,xsd:base64Binary等。

1.4定義複雜資料型別:

     xml schema提供靈活和強大的機制來構建負責資料結構。你可以建立資料結構通過建立一個元素和屬性的序列。你看可以擴充套件已有型別來建立更復雜的型別。

    另外,為了構建複雜資料結構,你可以描述特定的型別,諸如:列舉型別。資料型別中的資料有一個特定的取值範圍,或者資料型別的數值必須遵循某種特定的模式,通過擴充套件或者限制原始型別。

1.5定義資料結構:

    在xml schema中,資料單元是資料域的集合,這些資料域是通過負責型別元素定義的。指明一個複雜的型別需要三塊資訊:

    a.複雜元素的名稱需要被指定。

    b.複雜型別的第一個子元素用來描述該結構的域的行為,當他被放入線上時。

    c.每個結構中的域,都被用element元素定義。

    下面的雷子是一個複雜型別有兩個子元素:

              結構如下:

struct personalInfo{ string name; int age; };

              對應的WSDL文件:

<complexType name="personalInfo"> <sequence> name="name" type="xsd:string" /> <element <element name="age" type="xsd:int" /> </sequence> </complexType>

注1:複雜型別的種類:

      xml schema有三種方式描述當xml文件被展現並通過線上展示時,其中的域如何被組織。第一個子元素確定哪種複雜型別被引用。下面展示了用來定義複雜型別行為的三種方式:

  • sequence:所有的複雜型別域必須被顯示,並且他們必須有一個確定的次序,該次序與型別定義的次序相同。
  • all:所有的複雜型別域都需要有,但是次序無所謂
  • choice:僅僅是元素中一個可以出現在訊息中。

注2:定義結構的部分:

      你定義資料域,這些資料域是由一個結構體組成。每個複雜型別元素應該包括至少一個element元素。每個element元素對應已經定義的資料結構中的一個域。

     為了充分描述資料結構中的域,element必須有兩個屬性:

    name屬性:指明資料域的名稱並且是唯一的

    type屬性:指明該域儲存的資料的型別。可以是簡單型別也可以是複雜型別。

  除此而外還有兩個重要屬性:minOccurs和maxOccurs,這個屬性用來設定該域在結構中發生的次數上下限。預設情況下每個欄位值發生一次。使用這些屬性,你可以改變結構體中一個域發生的次數。下面的例子中,previousJobs最少發生一次,最多7次。

<complexType name="personalInfo> <all> ment name="name" type="xsd:string"/> <el <el eement name="age" type="xsd:int"/> pe="xsd:string: minOccurs="3" maxOccu <element name="previousJobs" t yrs="7"/> </all> </complexType> 注3:定義屬性:在xml文件中,屬性被包含在element內部的。例如在complexType元素中name就是屬性,它通常跟在<sequence>,<all>等元素的後面。例如: <complexType name="personalInfo> <all> ment name="name" type="xsd:string"/> <el <el eement name="previousJobs" type="xsd:string" </all> <attribute name="age" type="xsd:i minOccurs="3" maxOccurs="7"/> nt" use="optional" /> </complexType> 1.6定義陣列

   CXF支援兩種方式來定義陣列,第一種是定義一個複雜型別,採用簡單元素,他的最大發生屬性是個大於1的值,第二種方式是使用SOAP陣列,SOAP陣列提供增加的功能,比如ability來簡化定義多為陣列並且傳送分離後的陣列。

  複合型別陣列:複合型別陣列是特殊的sequence複合型別。你可以簡單定義一個複合型別通過簡單元素,並且制定該元素的最大發生maxOccurs屬性。例如,定義一個數組,擁有二個浮點數字,你可以使用複合型別如下:

<complexType name="personalInfo> <element name="averages" type="xsd:float" maxOccurs="20"/></complexType> 你也可以定義一個最小發生屬性。

SOAP陣列:SOAP陣列定義通過SOAP-ENC:Array,該型別基於wsdl:arrayType元素。

<complexType name="TypeName"> <complexContent> <restriction base="SOAP-ENC:Array"> <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="ElementType<ArrayBounds>"/> </restriction> </complexContent></complexType> 上述語法中,typename指定新定義的陣列名,ElementType指定陣列中元素的資料型別。ArrayBounds指定陣列的維度及元素數量,單位陣列通過[],多維通過[][]。 <complexType name="SOAPStrings"> <complexContent> se="SOAP-ENC:Array"> <attribute r <restriction b aef="SOAP-ENC:arrayType" ayType="xsd:string[]"/> </restriction> </c wsdl:ar romplexContent> </complexType>

1.7通過extension定義型別

   類似主要的編碼語言,xml schema允許你建立資料型別,這些資料型別整合已有的資料型別,這種機制被稱之為:extension。例如你可以建立一個新型別名叫alienInfo,它集成了PersonalInfo結構,通過鄭家了新的元素planet。

  extension的型別定義包括四個部分:

 a.通過name屬性來定義型別名

 b.通過complexContent元素來指定新型別將擁有多餘一個的元素。

 c.被繼承的那個類,被稱之為base型別,通過base屬性來指定。

 d.新型別和屬性被定義在extension元素中。例子如下:

<complexType name="alienInfo"> <complexContent> ="personalInfo"> <sequence> <extension bas e <element name="planet" type="xsd:string"/> nt> </complexType </sequence> </extension> </complexCont e>

1.8通過restriction來定義型別

簡單例子

<simpleType name="SSN"> <restriction base="xsd:string"> <pattern value="\d{3}-\d{2}-\d{4}"/> </restriction> </simpleType>

1.9定義列舉型別:

<simpleType name="widgetSize"> <restriction base="xsd:string"> <enumeration value="big"/> > <enumeration value="mungo" <enumeration value="large" //> </restriction> </simpleType>

2定義元素:

在xml schema中的元素體現為一個元素的例項。大多數最基本的元素有簡單元素組成。像element元素,他是由一定數量的複雜型別定義的。它有三個屬性:

  • 名稱:一個需要的屬性來指明元素的名字
  • type:指明元素的型別,這個型別可以是任何xml schema的原型別或者任何已經命名的複合型別。這個屬性屬性可以被省略,如果型別已經內建定義。
  • nillable:指定是否元素可以從一個文件中忽略,如果是ture,則元素可以被任何根據該SCHEMA生成資料檔案中忽略。

一個元素可以有一個內建型別定義,內建型別被指明,通過複合型別元素或者簡單型別元素。一旦你說明了是否資料型別是複合或者簡單,你可以定義任何你需要的資料型別。內建型別定義建議不被使用,因為他不支援重用。

相關推薦

php學習WSDL()

WSDL文件使用web服務描述語言來定義服務。 文件包括邏輯(抽象)部分和具體部分。 抽象部分用於定義獨立於實現的資料型別和訊息,具體部分定義一個endpoint如何實現一個可以與外界進行互動的服務。 通常建議在寫程式碼前定義WSDL文件和XML schema,但

php學習php中is_file和file_exist的差別,and推斷文件夾is_dir

文件 -m post 文件的 style 文件夾 原因 -a 文件名 在PHP中,is_file和file_isexist是有非常小差別的 1) is_file: $path ="/path/to/file/text.txt"; if(file_exis

SecureCRT學習SecureCRT 經常使用技巧

left popu nal copy crt 通過 時間 ddl pop 快捷鍵: 1、 ctrl + a : 移動光標到行首 2、 ctrl + e :移動光標到行尾 3、 ctrl + d :刪除光標之後的一個字符 4、 ctrl + w : 刪除行首到

struts2框架學習筆記2配置

true class 規範 開發規範 刪除用戶 建議 類名 esp 需要 核心配置文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Soft

Elasticsearch 學習配置文件

服務器 elastic 設置 .org settings filter ESS 通用 其它 Elasticsearch配置文件##################### Elasticsearch Configuration Example ################

深度學習---yolov1,v2,v3

(寫在前面:如果你想 run 起來,立馬想看看效果,那就直接跳轉到最後一張,動手實踐,看了結果再來往前看吧,開始吧······) 一、YOLOv1 簡介 這裡不再贅述,之前的我的一個 GitChat 詳盡的講述了整個程式碼段的含義,以及如何一步步的去實現它,可參照這裡手把手實踐YOLO深度殘

Struts學習Message Resources配置

目錄 一、概述 二、用法 三、建立資源包 四、配置 五、資原始檔放在哪裡 六、Tags 七、Actions 八、國際化 九、JSTL 十、結論 一、概述        Message Resources訊息

HTML5-從0開始學習表單屬性

什麼是表單? 表單是網頁中資料採集的工具。 表單組成部分由三部分組成: (一)表單標籤<form> (二)表單域<input> (三)表單按鈕<button> 現在我們來逐步解釋這三部分。 (一)表單標籤<form>

wpfxaml

首先我們還是新建一個空專案,看一下VS給我們預設生成的xaml結構。 <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006

Java學習彈球遊戲分步解析(二)——讓小球飛

之前跟大家說要把事件監聽器和多執行緒分開來講,不過之後發現事件監聽器要涉及到很多小球運動的操作,所以,決定將兩個知識點合起來說,這樣會更便於大家理解: 實現小球在我們所繪製的窗體上運動就必須要用到多執行緒;讓小球類繼承Thread類,再重寫void run(){}方法即可;

機器學習決策樹演算法

1-1 基本流程 決策樹是一個有監督分類與迴歸演算法。 決策樹的生成只考慮區域性最優,相對的,決策樹剪枝則考慮全域性最優。 一、概念: 決策樹:是一種樹形結構,其中每個內部節點表示一個屬性上的判斷,每個分支代表一個判斷結果的輸出,最後每個葉節點代表一

九.ARM裸機學習串列埠通訊1(串列埠通訊介面及原理框圖

一.串列埠通訊的基本概念及原理理解 2017/11/12 22:52 1.同步通訊和非同步通訊: 非同步通訊:指通訊的傳送與接收裝置使用各自的時鐘控制資料的傳送和接收過程。為使雙方的收發協調,要求傳送和接收裝置的時鐘儘可能一致,即傳送方和接收方沒有統一的時鐘節拍、而各自按照

navicat for mysql學習navicat for mysql 顯示中文亂碼解決辦法

在“連線屬性”的設定中,高階-“使用mysql字符集”去掉鉤,並且將編碼改為10008-GB2312. 然後進入navicat的控制檯後,show variables like 'char%';命令後如下: +--------------------------+-----------------------

[No000013F]WPF學習X名稱空間

4.2 情況 之前 集中 sharp 要求 mes ble 實例 原文:[No000013F]WPF學習之X名稱空間詳解X名稱空間裏面的成員(如X:Name,X:Class)都是寫給XAML編譯器看的、用來引導XAML代碼將XAML代碼編譯為CLR代碼。 4.1X名稱空間

Android學習主題樣式開發

本文和大家分享的主要是android開發主題樣式相關內容,一起來看看吧,希望對大家學習和使用這部分內容有所幫助。   app如何設定主題   1. 在res/values/styles.xml檔案中新增程式碼:   2. 在

Java學習多執行緒——讓小球動起來()

在講執行緒之前,我們先來談談程序。在我接觸電腦的一段時間後,開始發現當開啟工作管理員後,會有一個程序的顯示,下面的映像名稱裡有很多的可執行檔案。這些可執行檔案有的是系統預設的,有的是我們開啟的,他們都會佔用一定記憶體。 知道了程序,那麼什麼是執行緒呢?執行緒就是執行中程式

安卓開發學習014 Button應用(樣式、背景、按鈕單擊、長按、雙擊、多擊事件)

一、Button簡介 按鈕也是繼承自TextView 二、XML定義方法 <Button android:id="@+id/button01" android:layout_width="w

WPF學習X名稱空間

X名稱空間裡面的成員(如X:Name,X:Class)都是寫給XAML編譯器看的、用來引導XAML程式碼將XAML程式碼編譯為CLR程式碼。 4.1X名稱空間裡面到底都有些什麼? x名稱空間對映的是:

淘寶API學習淘寶TOPAPI介面接入教程

作為一箇中小型網站開發者,淘寶API的開放大大縮短了網站的開發週期和運作效率,面對海量的資料,開發者只要仔細閱讀開發文件,熟悉相應的介面,就可以把資料匯入自己的網站,這樣就不必望洋興嘆了。目前淘寶TOP的API介面正日益完善,但相應的介面和開發文件還不是很全,經過了3天的仔

SecureCRT學習SecureCRT常用快捷鍵設定與字型設定方法

1:如果不想每次登陸都輸入密碼,可以在你開啟的session裡郵件session option->login action 選中automate logon 雙擊ogin 和assword分別輸入使用者名稱和密碼就行了,telnet的命令符為〉,敲入指令的命令符為#