Database

[Oracle]OracleからWebサービスを利用する方法

スポンサーリンク

SOAPリクエストを送信してレスポンスを表示する

前回はOracleからWebサイトにアクセスする方法を記載しましたが、今回はOracleからSOAP形式のWebサービスを利用する方法を記載します。

ACL設定まではWebサイトにアクセスする方法と同じですので、前回の記事を参考にしてください。

SOAPメッセージの作成 

SOAPリクエストを送信するには、受け取る側のWebサービスが必要ですので、

サービスを使って記載していきます。

Webサービスのインターフェイスを確認する為に、WSDLを参照します。
このWSDLの定義に従ってSOAPメッセージを作成します。
http://www.webservicex.net/globalweather.asmx?wsdl

WSDLを参照しながらSOAPメッセージを作成するのは難しいと思いますので、そんな場合はSOAP UIなどのツールでひな形を作成することをお勧めします。

SOAPリクエストの送信 

PL/SQLからGetCitiesByCountryのSOAPアクションを呼び出す場合。

/* GetCitiesByCountry */
SET SERVEROUTPUT ON

DECLARE 
	http_req      UTL_HTTP.REQ;
	http_resp     UTL_HTTP.RESP;
	soap_req VARCHAR2(1024);
	value    VARCHAR2(1024);
BEGIN
	-- タイムアウト(60秒)設定
	UTL_HTTP.SET_TRANSFER_TIMEOUT(60); -- 
	
	-- SOAPリクエスト設定
	soap_req := '<?xml version="1.0" encoding="utf-8"?>
	             <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	               <soap:Body>
	                 <GetCitiesByCountry xmlns="http://www.webserviceX.NET">
	                   <CountryName>japan</CountryName>
	                 </GetCitiesByCountry>
	               </soap:Body>
	             </soap:Envelope>';
	
	-- HTTPリクエスト設定
	http_req := UTL_HTTP.BEGIN_REQUEST('http://www.webservicex.net/globalweather.asmx',
	                                   'POST',
	                                   'HTTP/1.1');
	UTL_HTTP.SET_HEADER(http_req, 'Content-Type', 'text/xml; charset=utf-8');
	UTL_HTTP.SET_HEADER(http_req, 'Content-Length', LENGTH(soap_req));
	UTL_HTTP.SET_HEADER(http_req, 'SOAPAction', '"http://www.webserviceX.NET/GetCitiesByCountry"');
	UTL_HTTP.SET_HEADER(http_req, 'User-Agent', 'Mozilla/5.0');
	
	-- HTTPレスポンス取得
	UTL_HTTP.WRITE_TEXT(http_req, soap_req);
	http_resp := UTL_HTTP.GET_RESPONSE(http_req);
	
	-- ステータスコード判定
	IF http_resp.status_code = 200 THEN
		BEGIN
				-- HTTPレスポンス
				DBMS_OUTPUT.PUT_LINE('Status Code: ' || http_resp.status_code);
				DBMS_OUTPUT.PUT_LINE('Reason Phrase: ' || http_resp.reason_phrase);
			LOOP
				-- SOAPレスポンス
				UTL_HTTP.READ_LINE(http_resp, value, TRUE);
				DBMS_OUTPUT.PUT_LINE(value);
			END LOOP;
			UTL_HTTP.END_RESPONSE(http_resp);
		EXCEPTION
			WHEN UTL_HTTP.END_OF_BODY THEN
				UTL_HTTP.END_RESPONSE(http_resp);
		END;
	ELSE
		UTL_HTTP.END_RESPONSE(http_resp);
		-- HTTPレスポンス
		DBMS_OUTPUT.PUT_LINE('Status Code: ' || http_resp.status_code);
		DBMS_OUTPUT.PUT_LINE('Reason Phrase: ' || http_resp.reason_phrase);
	END IF;
END;
/

 PL/SQLからGetWeatherのSOAPアクションを呼び出す場合。

/* GetWeather */
SET SERVEROUTPUT ON

DECLARE 
	http_req      UTL_HTTP.REQ;
	http_resp     UTL_HTTP.RESP;
	soap_req VARCHAR2(1024);
	value    VARCHAR2(1024);
BEGIN
	-- タイムアウト(60秒)設定
	UTL_HTTP.SET_TRANSFER_TIMEOUT(60); -- 
	
	-- SOAPリクエスト設定
	soap_req := '<?xml version="1.0" encoding="utf-8"?>
	             <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	               <soap:Body>
	                 <GetWeather xmlns="http://www.webserviceX.NET">
	                   <CityName>tokyo</CityName>
	                   <CountryName>japan</CountryName>
	                 </GetWeather>
	               </soap:Body>
	             </soap:Envelope>';
	
	-- HTTPリクエスト設定
	http_req := UTL_HTTP.BEGIN_REQUEST('http://www.webservicex.net/globalweather.asmx',
	                                   'POST',
	                                   'HTTP/1.1');
	UTL_HTTP.SET_HEADER(http_req, 'Content-Type', 'text/xml; charset=utf-8');
	UTL_HTTP.SET_HEADER(http_req, 'Content-Length', LENGTH(soap_req));
	UTL_HTTP.SET_HEADER(http_req, 'SOAPAction', '"http://www.webserviceX.NET/GetWeather"');
	UTL_HTTP.SET_HEADER(http_req, 'User-Agent', 'Mozilla/5.0');
	
	-- HTTPレスポンス取得
	UTL_HTTP.WRITE_TEXT(http_req, soap_req);
	http_resp := UTL_HTTP.GET_RESPONSE(http_req);
	
	-- ステータスコード判定
	IF http_resp.status_code = 200 THEN
		BEGIN
				-- HTTPレスポンス
				DBMS_OUTPUT.PUT_LINE('Status Code: ' || http_resp.status_code);
				DBMS_OUTPUT.PUT_LINE('Reason Phrase: ' || http_resp.reason_phrase);
			LOOP
				-- SOAPレスポンス
				UTL_HTTP.READ_LINE(http_resp, value, TRUE);
				DBMS_OUTPUT.PUT_LINE(value);
			END LOOP;
			UTL_HTTP.END_RESPONSE(http_resp);
		EXCEPTION
			WHEN UTL_HTTP.END_OF_BODY THEN
				UTL_HTTP.END_RESPONSE(http_resp);
		END;
	ELSE
		UTL_HTTP.END_RESPONSE(http_resp);
		-- HTTPレスポンス
		DBMS_OUTPUT.PUT_LINE('Status Code: ' || http_resp.status_code);
		DBMS_OUTPUT.PUT_LINE('Reason Phrase: ' || http_resp.reason_phrase);
	END IF;
END;
/

正常に処理された場合は200のステータスコードとともにSOAPレスポンスが返ってきます。
値を取り出したい場合は、レスポンスのSOAPメッセージをパースして取り出します。

タイトルとURLをコピーしました