Transcript HTML網頁基礎語言
第16章 Web Service應用程式架
構
16-1
16-2
16-3
16-4
16-5
Web Service應用程式架構
SOAP的基礎
HttpRequest物件建立SOAP應用程式
WSDL的基礎
Google搜尋服務的Web Service
16-1 Web Service應用程式架構
Web Service的基礎
Web Service應用程式架構
Web Service的基礎-1
Web Service屬於一種企業級的應用程式,
可以透過Internet建立自動機制提供資料
交換和工作分享等資源共享的功能。
Web Service使用簡單和公開標準的協定,
提供低成本的軟體整合和資料分享,它是
一種可以在不同的作業系統,使用不同的
程式語言開發的應用程式,能夠直接與位
在不同位置的其它應用程式進行通訊和資
料交換。
Web Service的基礎-2
Web Service應用程式提供一組通用服務,
可以同時提供多個用戶端(Client)使用,這
是一組使用XML格式作為傳遞訊息的函數
呼叫,用戶端透過HTTP傳送函數呼叫給伺
服端,伺服端以HTTP將結果傳回給用戶端,
它提供用戶端更多的彈性,因為可以只使
用所需的函數呼叫取得所需的資訊。
Web Service應用程式架構-1
Web Service基本上是提供一組通用的遠
端函數呼叫(RPC,Remote Procedure
Calls),為了用戶端和伺服端能夠依據相同
的訊息格式和規格來傳遞資訊,我們需要
一種標準的通訊協定,這就是「SOAP」
(Simple Object Access Protocol),它
是一種結合XML格式的訊息和HTTP協定的
通訊協定,使用SOAP的Web Service應
用程式架構。
Web Service應用程式架構-2
16-2 SOAP的基礎
什麼是SOAP
SOAP訊息的基本語法
SOAP訊息交換架構
什麼是SOAP-1
「SOAP」(Simple Object Access Protocol)
是一種在分散系統交換資料的通訊協定,它屬於
一種XML基礎的通訊協定,其傳送的資料就是
XML元素的資料。
SOAP屬於一種標準HTTP通訊協定的資料交換協
定,由Microsoft、DevelopMentor、IBM、
Lotus Development Corp.、HP、UserLand
Software等公司所共同製定,SOAP 1.1規格屬
於微軟Windows DNA 2000架構的主要元素,
提供分散式應用程式系統開發的資料交換。
什麼是SOAP-2
目前Internet服務或瀏覽程式都是支援HTTP,分
散式Internet應用程式雖然能夠使用「RPC」
(Remote Procedure Calls)執行DCOM物件,
但是HTTP通訊協定並不支援RPC,此時的SOAP
通訊協定就可以解決這個問題,其特點如下所示:
• SOAP是一種負載很輕的通訊協定,傳送的資料是文字
內容的XML文件。
• SOAP屬於一種在應用程式間使用HTTP通訊協傳遞資
料的協定。
• SOAP是一種XML基礎的技術,簡單而且擁有很好的擴
充性。
SOAP訊息的基本語法-1
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/
">
<SOAP-ENV:Header>
<t:Transaction xmlns:t="http://www.company.com/transaction"
SOAP-ENV:mustUnderstand="1">
5
</t:Transaction>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<m:getPrice xmlns:m="http://www.company.com/soap">
<code>1234</code>
</m:getPrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP訊息的基本語法-2
SOAP的名稱空間
SOAP應用程式產生的SOAP訊息需要定義所有元
素和屬性的名稱空間,而且SOAP應用程式一定
要能夠處理收到訊息的名稱空間,SOAP擁有兩
個預設的名稱空間,如下所示:
• SOAP Envelope預設的名稱空間,使用的字頭為
【SOAP-ENV】,如下所示:
http://schemas.xmlsoap.org/soap/envelope/
• SOAP加碼和資料型態預設的名稱空間,如下所示:
http://schemas.xmlsoap.org/soap/encoding/
SOAP訊息的基本語法-3
Envelope元素
Envelope元素為SOAP訊息的根元素,
SOAP訊息一定擁有此元素,如果元素包含
名稱空間宣告和額外的屬性,屬性也需要
使用名稱空間的字頭。
encodingStyle屬性是一組URI用來定義
SOAP加碼和資料型態,這個屬性能夠出現
在SOAP訊息的任何元素,如果在
Envelope元素,此時所有的子元素都屬於
名稱空間的範圍。
SOAP訊息的基本語法-4
Header元素
Header元素屬於SOAP訊息的選項元素,如果出
現,一定為Envelope元素的子元素,這是一個彈
性機制可以擴充SOAP訊息成為一個分散式的模
組,常常使用在授權、交易和付款管理。
Header元素的子元素一定需要宣告名稱空間和字
頭,可以使用兩個屬性,如下表所示:
屬性
actor
mustUnderstand
說明
這個屬性值為 URI,在定義 Header 元素的接受者
這個屬性值為 1 或 0,指出 Header 子元素為必須或選項元素
SOAP訊息的基本語法-5
Body元素
Body元素屬於SOAP訊息的主要元素,這是
Envelope元素的子元素,如果擁有Header元素,
Body元素必為Header元素的下一個元素,它的
內容是傳送的訊息,可以包含RPC呼叫,如下所
示:
<m:getPrice
xmlns:m="http://www.company.com/soap
">
<code>1234</code>
</m:getPrice>
SOAP訊息交換架構
SOAP訊息基本屬於單向的資料傳遞,可以從用
戶端到伺服端使用HTTP送出請求訊息,在伺服器
處理後將結果使用HTTP回應到用戶端,如下圖所
示:
HTTP請求的SOAP訊息
POST /BookDetail HTTP/1.1
Host: www.company.com
Content-Type: text/xml; charset="Big5"
Content-Length: nnnn
SOAPAction: " http://www.company.com/soap#getBookDetail"
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/
">
<SOAP-ENV:Body>
<m:getBookDetail xmlns:m="http://www.company.com/soap">
<code>F8915</code>
</m:getBookDetail>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
HTTP回應的SOAP訊息
HTTP/1.1 200 OK
Content-Type: text/xml; charset="Big5"
Content-Length: nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<m:getBookDetailResponse xmlns:m="http://www.company.com/soap">
<book code="F8915">
<title>ASP網頁製作徹底研究</title>
<author>陳會安</author>
<price>580</price>
</book>
</m:getBookDetailResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
16-3 HttpRequest物件建立SOAP應
用程式
SOAP應用程式的架構
HttpRequest物件和SOAP
SOAP應用程式的架構
SOAP應用程式架構需要在用戶端送出HTTP請求
到伺服端,擁有用戶端和伺服端兩個應用程式,
其檔案如下表所示:
應用程式檔名
default.htm
SOAPListener.asp
SOAPTest.asp
Orders.mdb
說明
用戶端應用程式,送出 SOAP 請求訊息
伺服端 SOAP 傾聽者應用程式,接收請求訊息後,在查詢資料庫
後將取得的資料回應到用戶端
這是 SOAP 傾聽者應用程式的測試程式,用來在伺服端顯示測試
查詢結果的 XML 文件
第 13 章的 Access 資料庫,本節的範例使用 Books 資料表的圖書資
料
HttpRequest物件和SOAP
MSXML剖析器的HttpRequest物件可以直
接在用戶端建立HTTP請求和回應,其架構
如下圖所示:
16-4 WSDL的基礎
SOAP應用程式如何使用WSDL
定義Web Service
定義Web Service傳送的訊息
定義RPC呼叫的輸入與輸出訊息
SOAP應用程式如何使用WSDL-1
「WSDL」(Web Services Description
Language)屬於一種以XML為基礎語言,
它是用來定義Web Service和描述如何使
用此Web Service服務的語言。
Web Service是使用SOAP作為資料傳遞
的通訊協定,而SOAP應用程式可以透過
WSDL檔案的內容知道Web Service的位
置、提供的RPC、訊息格式和如何使用這
些函數呼叫。
SOAP應用程式如何使用WSDL-2
用戶端首先取得WSDL檔案,可能儲存在本機或
是Web Service所在的伺服器,在取得WSDL檔
案後,就可以知道Web Service提供的服務和如
何使用它(這就是SOAP訊息的格式),現在我們
就可以使用此Web Sevice,在傳送SOAP請求後,
就可以等待SOAP回應的結果。
定義Web Service
<definitions name="urn:GoogleSearch"
targetNamespace="urn:GoogleSearch"
xmlns:typens="urn:GoogleSearch"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
…………
<service name="GoogleSearchService">
<port name="GoogleSearchPort"
binding="typens:GoogleSearchBinding">
<soap:address
location="http://api.google.com/search/beta2"/>
</port>
</service>
</definitions>
定義Web Service傳送的訊息
<message name="doGoogleSearch">
<part name="key"
type="xsd:string"/>
<part name="q"
type="xsd:string"/>
<part name="start"
type="xsd:int"/>
<part name="maxResults"
type="xsd:int"/>
<part name="filter"
type="xsd:boolean"/>
<part name="restrict"
type="xsd:string"/>
<part name="safeSearch"
type="xsd:boolean"/>
<part name="lr"
type="xsd:string"/>
<part name="ie"
type="xsd:string"/>
<part name="oe"
type="xsd:string"/>
</message>
定義Web Service傳送的訊息
<message name="doGoogleSearch">
<part name="key"
type="xsd:string"/>
<part name="q"
type="xsd:string"/>
<part name="start"
type="xsd:int"/>
<part name="maxResults"
type="xsd:int"/>
<part name="filter"
type="xsd:boolean"/>
<part name="restrict"
type="xsd:string"/>
<part name="safeSearch"
type="xsd:boolean"/>
<part name="lr"
type="xsd:string"/>
<part name="ie"
type="xsd:string"/>
<part name="oe"
type="xsd:string"/>
</message>
定義RPC呼叫的輸入與輸出訊息
在定義好SOAP請求和回應的訊息後,我們需要指定RPC
呼叫的輸入與輸出訊息,WSDL使用protType元素定義
每一個RPC呼叫操作的輸入與輸出訊息,如下所示:
<portType name="GoogleSearchPort">
………
<operation name="doGoogleSearch">
<input message="typens:doGoogleSearch"/>
<output
message="typens:doGoogleSearchResponse"/>
</operation>
</portType>
16-5 Google 搜尋服務的 Web
Service
申請Google的搜尋服務
使用Google搜尋服務的Web Service
申請Google的搜尋服務
申請Google會員
• Google 會員是一種免費服務,請在 Google
網站的新帳號網頁申請會員。
取得Web Service的授權碼
• 在申請好 Google 會員且啟動帳號後,就可以
申請 Web Service 的授權碼。
取得GoogleSearch.wsdl
• ASP.NET程式範例是Google搜尋服務的用戶
端程式,我們需要取得GoogleSearch.wsdl
的WSDL檔案和C#類別榴,相關檔案是位在
Google Web API。
使用Google搜尋服務的Web
Service-1
取得Web Service的C#類別檔
• 在googleapi.zip檔案就擁有C#類別檔,請解開此檔
案,在「googleapi\dotnet\CSharp\Web
References\Google」資料夾下,就可以看到
GoogleSearch.wsdl和Reference.cs兩個檔案。
在ASP.NET程式使用Web Service的C#類別檔
案
• 將C#類別檔案視為ASP.NET的外部類別檔案即可,如
下所示:
<%@ Page language="vb" Src="Reference.cs"%>
使用Google搜尋服務的Web
Service-2
在ASP.NET程式以VB.NET語法來使用Web
Service,首先匯入所需的名稱空間,如下所示:
<%@ Import
Namespace="Google_Web_APIs_Demo.Go
ogle" %>
在名稱空間後,Google的Web Service就是建
立GoogleSearchService物件,如下所示:
Dim objGoogle As GoogleSearchService =
New GoogleSearchService()
使用Google搜尋服務的Web
Service-3
建立GoogleSearchService物件後,使用
doGoogleSearch方法取得Google的搜尋
結果的GoogleSearchResult物件,如下
所示:
Dim objResult As GoogleSearchResult =
objGoogle.doGoogleSearch( _
GoogleKey, searchText, recordNo, PageSize,
False, "", False, "", "", "")
使用Google搜尋服務的Web
Service-4
傳回值是GoogleSearchResult物件,其
相關屬性,如下表所示:
屬性
searchQuery
searchTime
startIndex
endIndex
estimatedTotalResultsCount
resultElements
說明
查詢的關鍵字字串
查詢花費的時間
查詢結果的開始筆數
查詢結果的結束筆數
查詢結果的總筆數
取得查詢結果的 ResultElement 物件陣列
使用Google搜尋服務的Web
Service-5
resultElements屬性能夠取得查詢結果的網站資
料,每一個網站是一個ResultElement物件,可
以使用For迴路取得每一個物件,如下所示:
For i = 0 To
objResult.resultElements.GetUpperBound(0)
objResult.resultElements(i).summary.ToString()
objResult.resultElements(i).URL.ToString()
…………
Next
使用Google搜尋服務的Web
Service-6
ResultElement物件可以使用其屬性取得
相關資料,如下表所示:
屬性
summary
URL
title
cachedSize
directoryTitle
說明
網站說明
網站的網址
網站名稱
網頁尺寸
網站分類