1. 程式人生 > >【WebService】第五章、WSDL檔案詳解

【WebService】第五章、WSDL檔案詳解

本章主要詳細記錄如何讀懂一個WSDL描述檔案。

      在上一章裡面我們已經成功部署了一個WebService服務,並且通過瀏覽器能夠順利的看到WSDL檔案。那麼該檔案

表示什麼含義呢?通過這個檔案我們該如何呼叫他呢?

1、先列出一份簡單的wsdl

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://www.ztesoft.com/axis/sayHello"
	xmlns:apachesoap="http://xml.apache.org/xml-soap" 
	xmlns:impl="http://www.ztesoft.com/axis/sayHello"
	xmlns:intf="http://www.ztesoft.com/axis/sayHello" 
	xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
	xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	
	<wsdl:message name="qryUserNameRequest">
		<wsdl:part name="name" type="xsd:string" />
	</wsdl:message>
	<wsdl:message name="qryUserNameResponse">
		<wsdl:part name="qryUserNameReturn" type="xsd:string" />
	</wsdl:message>
	
	<wsdl:portType name="HelloImpl">
		<wsdl:operation name="qryUserName" parameterOrder="name">
			<wsdl:input message="impl:qryUserNameRequest" name="qryUserNameRequest" />
			<wsdl:output message="impl:qryUserNameResponse" name="qryUserNameResponse" />
		</wsdl:operation>
	</wsdl:portType>
	
	<wsdl:binding name="SayHelloSoapBinding" type="impl:HelloImpl">
		<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
		<wsdl:operation name="qryUserName">
			<wsdlsoap:operation soapAction="" />
			<wsdl:input name="qryUserNameRequest">
				<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
					namespace="http://www.ztesoft.com/axis/sayHello" use="encoded" />
			</wsdl:input>
			<wsdl:output name="qryUserNameResponse">
				<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
					namespace="http://www.ztesoft.com/axis/sayHello" use="encoded" />
			</wsdl:output>
		</wsdl:operation>
	</wsdl:binding>
	
	<wsdl:service name="HelloImplService">
		<wsdl:port binding="impl:SayHelloSoapBinding" name="SayHello">
			<wsdlsoap:address location="http://127.0.0.1:8080/axis/services/SayHello" />
		</wsdl:port>
	</wsdl:service>
	
</wsdl:definitions>

2、描述一個wsdl需要從那些方面描述

首先讓我們想一想,如果你想告訴別人你的網路服務,最起碼你要讓別人知道那些資訊,別人才能呼叫。

      1、服務的請求地址,最好多個服務繫結到一個地址上。傳遞引數時指明呼叫方法名就可以了。

      2、服務使用了什麼協議傳輸資料,例如soap協議,或者http協議的get方法,或者http協議的post方式等。

      3、在這個地址中,有哪些可以操作的方法。方法入參是什麼,出參是什麼。例如出參是UserInfo複雜物件。

      4、針對上面的方法,詳細描述入參或者出參的結構。例如UserInfo裡面有哪些String型別的,那些int型別的等。

3、針對上面提出的要求,我們來看看wsdl檔案內的內容。

上面的wsdl檔案由4個節點組成。首先根節點是wsdl:definitions表示這個是一個wsdl的定義檔案。(檔案從下往上看)

      3.1、wsdl:definitions:根節點,表示裡面的內容是用來描述webservice的,首先引入schema。這樣就不能亂寫了。

      3.2、wsdl:service:提供了一個地址,如果你想訪問這個服務就呼叫這個地址就行了。

      3.3、wsdl:binding:服務的協議,例如使用了soap協議。

      3.4、wsdl:portType:具體的服務集合,有哪些方法可以操作。方法入參是什麼,出參是什麼。

      3.5、wsdl:message:訊息的詳細資訊,詳細描述了出參是什麼,入參是什麼。

4、我對wsdl的一些看法

第一次看這個文件挺難理解的。如果你瞭解下面幾個原因我想看著也許挺容易的。

      1、比較複雜的東西應該抽取出來複用。例如上面的wsdl:portType裡面有方法入參和出參。之所以用wsdl:message抽

取出來作為一個節點描述入參和出參。不就是為了複用嗎,如果寫在一起有別的方法也用到這種型別入參或者出參。那豈

不是還要寫一次。

      2、其實這個和配置servlet有些相似。servlet配置時配置如下

	<servlet>
		<servlet-name>AxisServlet</servlet-name>
		<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>AxisServlet</servlet-name>
		<url-pattern>/services/*</url-pattern>
	</servlet-mapping>

      例如上面想把一個url和一個類對應起來,中間加了一個servlet-name節點做為中間連線點,為什麼不直接把url和類映

射到一起呢?我想如果這樣做,可能不合理,要是直接對映。那麼多一個對應該類的請求就需要多寫一次類的全名,例如

<servlet-mapping>
	<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
	<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
	<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
	<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
如果中間多出來一個步驟,使用別名來對應應該方便很多。以後更改類了,只要改一次就可以了,如果不是的話,那麼豈

不是每一個都需要改。

      而這裡呢?wsdl:service可以看成是url-pattern。wsdl:binding則相當於是servlet-name。wsdl:portType相當於servlet-class

這樣看是不是容易了,而且還可以新增很多額外的資訊。例如wsdl:binding還可以新增一些描述資訊,例如使用什麼協議。

5、上面檔案的含義

      服務集合wsdl:service裡面有個服務SayHello的訪問地址是http://127.0.0.1:8080/axis/services/SayHello,這個服務的

使用協議(通過什麼方式傳輸資料)是wsdl:binding描述的。並且通過他我們還可以找到具體實現類wsdl:portType,在這

個類中有哪些方法wsdl:operation,以及方法的詳細入參(wsdl:input)出參(wsdl:output)。在wsdl:message中可以看

到引數的詳細組成。

6、通過上面的wsdl檔案,我們如何呼叫

package com.ztesoft.axis.client;

import javax.xml.namespace.QName;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class Client {
	public static void main(String[] args) throws Exception {
		
		// wsdlsoap:address 節點中的地址值。
		String url = "http://127.0.0.1:8080/axis/services/SayHello";
		Service service = new Service();
		Call call = (Call) service.createCall();
		call.setTargetEndpointAddress(url);
		
		// wsdl:portType 裡面的操作方法。
		call.setOperationName(new QName(url, "qryUserName"));
		
		// 根據描述傳入一個String物件,因為可能有多個入參,所以使用Objct[]
		// 描述的返回引數是String, 強轉String。
		String result = (String) call.invoke(new Object[]{"Readiay"});
		System.out.println(result);;
	}
}
      上面就是使用axis提供的客戶端簡單呼叫一下,最後在控制檯就簡單的列印了處理後的東西。在後面的章節將詳細說明

如何呼叫客戶端的內容。此處先做一個簡單說明。

相關推薦

WebServiceWSDL檔案

本章主要詳細記錄如何讀懂一個WSDL描述檔案。       在上一章裡面我們已經成功部署了一個WebService服務,並且通過瀏覽器能夠順利的看到WSDL檔案。那麼該檔案 表示什麼含義呢?通過這個檔案我們該如何呼叫他呢? 1、先列出一份簡單的wsdl <?xml v

epub檔案處理 -- 壓epub檔案

https://github.com/geometer/FBReaderJ 第五章、epub檔案處理 -- 解壓epub檔案 本章將介紹程式是如何將epub內部被壓縮過的xml檔案轉化為一個可以正常解析的char陣列。要想將檔案轉換成char陣列,就需要一個字元流類

練習題--條件迴圈(Think Python)

//--地板除。例:5//4=1 %--求模。例:5//3=2 如果你用Python2的話,除法是不一樣的。在兩邊都是整形的時候,常規除法運算子/就會進行地板除法,而兩邊只要有一側是浮點數就會進行浮點除法。 複合語句中語句體內的語句數量是不限制的,但至少要有一個。有的時候會遇到一個語句體

組合語言——課後總結

1.[BX] mov ax,[bx] 功能:bx中存放的資料作為一個偏移地址EA,段地址SA預設在ds中,將SA:EA處的資料送入ax中。即:(ax)=((ds)*16+(bx))。 mov [bx],ax 功能:bx中存放的資料作為一個偏移地址EA,段地址SA預設在ds中,將ax中的資料送入記憶體S

JanusGraph:資料庫建模

第五章:資料模型 Chapter 5. Schema and Data Modeling 每個JanusGraph圖都是由邊標籤(edge label)、屬性key、頂點標籤(vertex label)構成。JanusGraph圖模型(schema)可以顯示定義也可以隱

實踐上機實踐

1、實踐題目:工作分配問題 2、問題描述 設有n件工作分配給n個人。將工作i分配給第j個人所需的費用為cij 。 設計一個演算法,對於給定的工作費用,為每一個人都分配1 件不同的工作,並使總費用達到最小。 輸入: 輸入資料的第一行有1 個正整數n (1≤n≤20)。接下來的n行,每行n個數,表示工作費

演算法作業

【演算法】第五章作業 1.你對回溯演算法的理解(2分) 回溯法有“通用的解題法”之稱,它是以深度優先方式系統搜尋問題解的演算法。其中解空間這個概念很重要,可以這麼說它是演算法在尋找解的活動範圍,在這個策略中,他按照深度優先策略,從根結點出發搜尋解空間樹(解空間樹是一個較為虛擬的概念,可以讓人更理解尋解過程

iOS01講 UIView/UIViewController/UIApplication

一、UIView詳解 Command+Alt+Enter -> 顯示ViewController 按住Ctrl直接把UIView拖到ViewController  1.1 UIView的常見屬性  @property(nonatomic,reado

處理器攔截器

5.1、處理器攔截器簡介 Spring Web MVC的處理器攔截器(如無特殊說明,下文所說的攔截器即處理器攔截器) 類似於Servlet開發中的過濾器Filter,用於對處理器進行預處理和後處理。   5.1.1、常見應用場景 1、日誌記錄:記錄請求資訊的

資料庫視訊 操作架構索引和檢視

一.建立檢視 1.語法格式 CREATE VIEW view_name(view_column_name) AS query_expression [WITH CHECK OPTION] 方法:①通過圖形化介面建立檢視 新建檢視,新增表,定義需要檢視

算法導論堆排序

兩個 高度 位置 思想 n) 隊列 sigma 復雜 max 基本過程: 1、保持最大堆的性質:假設兩個子堆都滿足,只需要根節點依次換下去,復雜度O(lg n) 2、初始化堆:後半段都是葉子,在前半段從後往前,依次執行上述最大堆性質的操作,名義復雜度是O(n lg n),

算法導論快速排序

很好 補充 第七章 而是 合並 art 元素 一個 排序 快排的優勢: 1、期望為O(n lgn) 2、常數因子比較小 3、就地排序 4、在虛存環境很好工作 與合並排序一樣是分治思想,但是不是從中間截斷,而是通過partition過程實現的 每次選擇最後一個元素為q,然

軟件構造第二節 設計可復用的軟件

pre ron start arr 應用 time 抽象 組合 double 第五章第二節 設計可復用的軟件 5-1節學習了可復用的層次、形態、表現;本節從類、API、框架三個層面學習如何設計可復用軟件實體的具體技術。 Outline 設計可復用的類——LSP

軟件構造三節 可復用的設計模式

類方法 iterator weight 獨立 spl temp 委派 inline game 第五章第三節 可復用的設計模式 除了Framework,5-2節所討論的其他技術都過於“基礎”和“細小”,有沒有辦法做更大規模的復用設計? 本節將介紹幾種典型的“面向復用”的設計

計算機網路 資料鏈路層(1)

一.資料鏈路層服務 1. 概述 (1)術語   ·主機和路由器:結點   ·連線相鄰結點的通訊通道:鏈路(有線、無線、區域網)   ·鏈路層資料分組:幀 (2)資料鏈路層主要任務:通過一條鏈路從一個結點向另一個物理鏈路直接相連的相鄰結點傳送資料報 2. 鏈路層服務 (1)組幀   ·封裝資料

計算機網路 資料鏈路層(2)

三.多路訪問控制(MAC)協議 1. 兩類鏈路 (1)點對點鏈路:撥號接入的PPP、乙太網交換機與主機間的點對點鏈路 (2)廣播鏈路(共享介質):早期的匯流排乙太網、HFC的上行鏈路、802.11無線區域網 2. 基本概念 (1)單一共享廣播通道 (2)兩個或兩個以上結點同時傳輸,則發生衝突;結點

.NET Core專案實戰-統一認證平臺 閘道器篇-自定義快取Redis

原文: 【.NET Core專案實戰-統一認證平臺】第五章 閘道器篇-自定義快取Redis 【.NET Core專案實戰-統一認證平臺】開篇及目錄索引 上篇文章我們介紹了2種閘道器配置資訊更新的方法和擴充套件Mysql儲存,本篇我們將介紹如何使用Redis來實現閘道器的所有快取功能,用到的文件及原始

計算機網路 資料鏈路層(3)

四.ARP協議 1. MAC地址(LAN地址、實體地址、乙太網地址) (1)作用:用於區域網內標識一個幀從哪個介面發出,到達哪個物理相連的其他介面 (2)固化在網絡卡的ROM中(唯一的),有時可以軟體設定 (3)表示:十六進位制、六個位元組,如1A-2F-BB-76-09-AD (4)管理:IEEE

匯編語言——課後總結

div 訪問內存 段地址 [1] 方式 賦值 解決 行程 bug 1.[BX] mov ax,[bx] 功能:bx中存放的數據作為一個偏移地址EA,段地址SA默認在ds中,將SA:EA處的數據送入ax中。即:(ax)=((ds)*16+(bx))。 mov [bx],ax

計算機組成與設計 大容量和高速度:開發儲存器層次結構

#5.1引言 區域性性原理表明了在任何時間內,程式訪問的只是它地址空間內相對較小的一部分。以下是兩種不同的區域性性: 時間區域性性(temporal locality):如果一個數據被訪問,那麼在