標籤:center 方法 dev post soap訊息 命名 通過 ota web服務
1. 概述
最近在ESB項目中,客戶在各個系統之間的服務調用大多都是在oracle預存程序中進行的,本文就oracle預存程序調用web service來進行說明。其他主流資料庫,比如mysql和sql service,調用web service的方法這裡就不做介紹了,本文主要用來介紹oracle預存程序調用Web Service的方法。
眾所周知,在Web Service通過HTTP協議發送請求和接收結果時,發送的請求內容和結果內容都採用XML格式封裝,並增加了一些特定的HTTP訊息頭,以說明HTTP訊息的內容格式,這些特定的HTTP訊息頭和XML內容格式就是SOAP協議。SOAP協議是基於HTTP協議的,兩者的關係就好比高速公路是基於普通公路改造的,在一條公路上加上隔離欄後就成了高速公路。
同理,在oracle的預存程序中能不能也通過建立XML格式的報文+HTTP協議來調用Web Service呢?答案是肯定的,在ORACLE中有一個名叫UTL_HTTP的工具包,我們可以通過這個工具包來實現預存程序調用Web Service。
上文提到的AEAI ESB是數通暢聯的核心產品之一,可以實現WEB服務開發和WEB服務註冊等功能,本文的介面範例,本考慮使用ESB建立的WEB服務,但是由於涉及到的需要介紹的內容和本文主題太遠,所以採用了AEAI DP開發平台內建的Web服務範例來說明。有對AEAI ESB感興趣的讀者可以通過本文最後的相關連結尋找瞭解。
2. 預期讀者
3. 環境資訊
作業系統:Windows7
Oracle: 版本為oracle11g
Mysql:版本為mysql5.1
Jdk: jdk1.6.0_10
4. 名詞解釋
AEAI ESB:應用整合平台主要作為公司資訊系統的“龍骨”來整合各業務系統,一般稱之為企業服務匯流排(Enterprise Service BUS,ESB),在數通暢聯軟體的產品家族中應用整合平台命名為AEAI ESB。
AEAI DP:AEAI DP應用開發平台專門用於開發MIS類的Java Web應用,也稱Miscdp(Misc Develope Platform)綜合應用開發平台。 AEAI DP應用開發平台在數通暢聯軟體產品家族中也作為擴充開發的支撐工具,比如:為AEAI Portal門戶平台擴充開發Portlet組件、Web Service和Http Service;為AEAI BPM流程整合平台擴充開發商務程序表單及功能等。
預存程序:大型資料庫系統中,一組為了完成特定功能的SQL 語句集,儲存在資料庫中,經過第一次編譯後再次調用不需要再次編譯,使用者通過指定預存程序的名字並給出參數(如果該預存程序帶有參數)來執行它。
UTL_HTTP:oracle中內建的HTTP協議工具包,可以用來發送post請求。
PL/SQL Developer:一個整合式開發環境,由Allround Automations公司開發,專門面向Oracle資料庫儲存的程式單元的開發
5. 操作步驟
5.1 建立範例介面
使用AEAI DP開發平台,建立內建WS服務的應用,如:
選擇資料庫資訊
部署應用後,查看剛剛建立的應用內建的WS服務
5.2 建立預存程序
5.2.1 基本文法
以下為建立預存程序的基本文法
CREATE OR REPLACE PROCEDURE預存程序名 ( --定義參數 ) IS 定義變數 BEGIN 開始PL/SQL體 END 說明PL/SQL體結束 |
5.2.2 建立步驟
1、開啟PL/SQL,並開啟一個sql視窗
2、將建立預存程序的語句放入其中並執行
這樣一個調用web service的預存程序範例就建立了,以下為詳細的範例sql體
--建立預存程序,定義四個參數,入參:userid,code,name;出參:resmark CREATE OR REPLACE PROCEDURE pro_test_ws(name in varchar2,resmark out varchar2) IS --定義四個變數,http請求,http返回,請求報文,返回報文 http_req UTL_HTTP.REQ; http_Resp UTL_HTTP.RESP; request_env VARCHAR2(32767); l_Replyline VARCHAR2(1000); BEGIN --開始pl/sql體 request_env := ‘ <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:demo="http://demo.service.wstest.agileai.com/"> <soapenv:Header/> <soapenv:Body> <demo:sayHi> <!--Optional:--> <theGirlName>‘|| name ||‘</theGirlName> </demo:sayHi> </soapenv:Body> </soapenv:Envelope> ‘; --列印請求報文 dbms_output.put_line(request_env); --請求WS地址 http_req := UTL_HTTP. begin_request(‘http://localhost:6060/cam/services/UserSync?wsdl‘, ‘POST‘, UTL_HTTP.http_version_1_1); -- 保持串連狀態 Utl_Http.Set_Persistent_Conn_Support(http_req, TRUE); --設定編碼 Utl_Http.Set_Header(http_req, ‘Content-Type‘, ‘text/xml;charset=utf-8‘); Utl_Http.Set_Header(http_req, ‘SOAPAction‘, ‘‘); --設定字元集 Utl_Http.Set_Body_Charset(http_req, ‘utf-8‘); --該參數代表我發送的POST報文多長,不可少 Utl_Http.Set_Header(http_req, ‘Content-Length‘, Lengthb(request_env)); Utl_Http.Write_Line(http_req, request_env); --賦值http返回 http_Resp := Utl_Http.Get_Response(http_req); --將請求報文賦值給 l_Replyline Utl_Http.Read_Text(http_Resp, l_Replyline); dbms_output.put_line(l_Replyline); --付給預存程序出參 resmark:=l_Replyline; END pro_test_ws; |
5.2.3 關鍵點說明
在預存程序中,使用UTL_HTTP工具包調用web服務時,幾個關鍵方法的使用說明
1. 通過佈建要求地址、方式、協議版本,得到http請求對象
http_req := UTL_HTTP. begin_request(‘ http://localhost:6060/wstest_project/services/HelloWorld?wsdl ‘, ‘POST‘, UTL_HTTP.http_version_1_1); |
2. 設定協議保持串連狀態
Utl_Http.Set_Persistent_Conn_Support(http_req, TRUE); |
3. 佈建要求編碼,SOAPAction header的值為空白串("")表示SOAP訊息的目的地由HTTP請求的URI標識;無值則表示沒有指定這條訊息的目的地。
Utl_Http.Set_Header(http_req, ‘Content-Type‘, ‘text/xml;charset=utf-8‘); Utl_Http.Set_Header(http_req, ‘SOAPAction‘, ‘‘); |
4. 設定字元集
Utl_Http.Set_Body_Charset(http_req, ‘utf-8‘); |
5. 報文長度
Utl_Http.Set_Header(http_req, ‘Content-Length‘, Lengthb(request_env)); |
6. 調用服務,發送報文
Utl_Http.Write_Line(http_req, request_env); |
7. 得到返回體
http_Resp := Utl_Http.Get_Response(http_req); |
8. 將返回報文賦值給變數
Utl_Http.Read_Text(http_Resp, l_Replyline); |
5.3 調用預存程序
5.3.1 使用PL/SQL Developer
測試
1) 選中預存程序的名字,右鍵選擇測試,進入測試頁面
2) 添加響應的參數值,F9或者點擊按鈕開始執行,執行後可以得到看到傳回值
3) 切換到DBMS輸出頁面,可以看到列印的內容
5.3.2 使用sql代碼調用
DECLARE resmark varchar2(1000); BEGIN pro_test_ws(‘‘小鄭‘,resmark); DBMS_OUTPUT.PUT_LINE(resmark); END; |
1) 開啟sql視窗,執行上面的sql語句
2) 查看輸出資訊
1處為預存程序列印的資訊,2為調用時列印輸出的資訊
6. 總結說明
本文介紹了在oracle預存程序中,使用UTL_HTTP工具包,通過建立請求報文以及使用HTTP協議來調用Web Service,從建立oracle預存程序以及UTL_HTTP相關參數的配置,到通過PL/SQL Developer測試調用以及sql代碼進行調用來詳細說明。
附件為預存程序建立sql、調用sql以及介面程式和相關的資料庫檔案。
7. 相關連結
AEAI DP開發平台/ AEAI ESB整合平台相關介質以及文檔資料地址:http://www.agileai.com/portal/website/01/res-share.ptml
文檔及代碼附件下載:http://pan.baidu.com/s/1kVyMVQn
ORACLE預存程序調用Web Service