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
[Oracle]データベースを再構築してOracle Expressのキャラクタセットを変更する

前回の記事でCSALTERを使用したキャラクタセットの変更方法を記載しましたが、サブセットのキャラクタセットからスーパセットへの変更のみ可能でした。 この記事で …

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

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

oracle
[Oracle]Oracle Clientのアンインストール方法

Oracle Clientをレジストリを含め完全に削除することがありましたので、この記事では削除手順を記載します。 削除手順ではレジストリを変更しますので十分注 …

sqlserer
[SQL Server]クロス集計の方法

PIVOTを使ってクロス集計する SQL ServerでExcelのピボットテーブルのようなクロス集計をするには、PIVOT関係演算子を使って集計することができ …

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

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

sqlserer
[SQL Server]再帰SQLで集計する

WITH(共通テーブル式)を使って集計する WITH句とは 共通テーブル式 (CTE) は、単一の SELECT、INSERT、UPDATE、DELETE、CR …

sqlserer
[SQLServer]日付文字列 + 時刻文字列をDATETIME型に変換する方法

SQLServerで日付文字列 + 時刻文字列をDATETIME型に変換する方法 日付と時刻を別のカラムに格納している場合に日時データとして扱いたい場合は CO …

oracle
Oracle 11g XEへのデータ移行方法を検討してみる

Oracleのデータ移行時は移行元と移行先の文字コードに注意する必要があります。 Windows環境のOracleでは「JA16SJIS」や「JA16SJIST …

db
[Database]データベースのバージョン/エディションを確認する方法

OracleとSQLServerのバージョン/エディションを確認 Oracle  SELECT * FROM V$VERSION SQLServer SELEC …

sqlserer
[SQLServer]形式指定で日付を取得する方法

SQLServerで形式を指定して日付を取得する 日付形式を指定するために、CONVERT関数、または、FORMAT関数を使用します。 CONVERT関数とFO …