[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
関連記事
-
-
[SQLServer]形式指定で日付を取得する方法
SQLServerで形式を指定して日付を取得する 日付形式を指定するために、CONVERT関数、または、FORMAT関数を使用します。 CONVERT関数とFO …
-
-
[Oracle]インストールに失敗する原因と対処方法
Oracleインストールエラー時の確認事項 OracleのデータベースやクライアントをWindowsへインストール中に インストーラが途中で落ちたり、エラーが発 …
-
-
[Oracle]Data Pumpを使用したデータベースのバックアップ
Data Pump機能のexpdp/impdpコマンドを使用するとデータベース全体、スキーマ単位、表単位など対象範囲を指定したバックアップやリストアを行うことが …
-
-
[SQLServer]日付文字列 + 時刻文字列をDATETIME型に変換する方法
SQLServerで日付文字列 + 時刻文字列をDATETIME型に変換する方法 日付と時刻を別のカラムに格納している場合に日時データとして扱いたい場合は CO …
-
-
Oracle12cのPDBを自動起動にする方法
Oracle12cのプラガブル・データベース(PDB)は初期設定のままでは、毎回、手動で起動させる必要があります。 この記事ではOS起動時やOracle再起動時 …
-
-
[Oracle]データベースを再構築してOracle Expressのキャラクタセットを変更する
前回の記事でCSALTERを使用したキャラクタセットの変更方法を記載しましたが、サブセットのキャラクタセットからスーパセットへの変更のみ可能でした。 この記事で …
-
-
[Oracle]トリガーの実行順序を設定する方法
FOLLOWS句を使用して実行順序を設定する 1つの表に対して同レベル(タイミング)のトリガーを複数作成することはできますが、実行順序は保証されていません。 実 …
-
-
[SQL Server]IDENTITYの値を初期化する
ID値の初期化(リセット)方法 IDENTITYプロパティを設定した列のID値を初期化(リセット)する方法を記載します。 現在のID値を確認する ID値を確認す …
-
-
Oracle12cでユーザを作成する方法
SQLコマンドを使用したユーザ作成 Oracle12cからマルチテナント・アーキテクチャが採用されており、以前までの手順ではユーザが作成できません。 ここではP …
-
-
[Oracle]WEBサイトやWEB APIをOracleから呼び出す方法
WEBリクエストを送信してレスポンスを表示する OracleからWEBサイトやWEB APIなどのネットワークサービスを呼び出すには、UTL_HTTPパッケージ …