Skill Note

平凡なエンジニアがメモ代わりにプログラミング, インフラ, ネットワークを書き綴るブログ

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

      2020/01/09

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

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

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

SOAPメッセージの作成 

SOAPリクエストを送信するには、受け取る側のWebサービスが必要ですので、
http://www.webservicex.net/GlobalWeather.asmxサービスを使って記載していきます。

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メッセージをパースして取り出します。

Google AdSense PC

Google AdSense PC

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

oracle
Oracle12cのPDBを自動起動にする方法

Oracle12cのプラガブル・データベース(PDB)は初期設定のままでは、毎回、手動で起動させる必要があります。 この記事ではOS起動時やOracle再起動時 …

oracle
Oracleで文字列を全角大文字に変換する(ひらがな・カタカナの小文字(捨て仮名)対応)

Oracleの文字列検索で全角半角、大文字小文字、ひらがなカタカナを区別しないであいまい検索する場合は比較対象の文字列形式を統一する必要があります。 文字列形式 …

sqlserer
[SQL Server]データを期間別に集計する

SQL Serverで集計表を出力 日付をDATETIME型で管理している場合、CONVERT関数、DATEPART関数を使って、日、週、月、年別の集計結果を出 …

oracle
[Oracle]データベーストリガーの作成方法

DMLトリガーを作成する データベーストリガーの中でももっとも一般的なDMLトリガーの作成方法と簡単な使用方法を記載していきます。 トリガーとは? トリガーとは …

oracle
[Oracle]CSALTERを使用してOracle Expressのキャラクタセットを変更する

Oracle Expressでは標準のキャラクタセットとしてAL32UTF8が設定されます。 キャラクタセットを意識しないでデータベースの移行やデータベース間の …

oracle
[Oracle]Data Pumpを使用したデータベースのバックアップ

Data Pump機能のexpdp/impdpコマンドを使用するとデータベース全体、スキーマ単位、表単位など対象範囲を指定したバックアップやリストアを行うことが …

oracle
[Oracle]ジョブをスケジューリングして定期実行する方法

DBMS_SCHEDULERパッケージを使用したジョブスケジューリング Oracleでジョブを定期実行するには、DBMS_SCHEDULERパッケージやDBMS …

oracle
Oracle12cでユーザを作成する方法

SQLコマンドを使用したユーザ作成 Oracle12cからマルチテナント・アーキテクチャが採用されており、以前までの手順ではユーザが作成できません。 ここではP …

oracle
ODP.NETをNuGetからインストールする

ODP.NETのインストール手順 Oracle 12cから公式のODP.NETがNuGetに追加されました。 この記事ではODP.NETをNuGetからインスト …

sqlserer
[SQL Server]IDENTITYの値を初期化する

ID値の初期化(リセット)方法 IDENTITYプロパティを設定した列のID値を初期化(リセット)する方法を記載します。 現在のID値を確認する ID値を確認す …