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 說明 網站說明 網站的網址 網站名稱 網頁尺寸 網站分類