SOAPリクエストを送信してレスポンスを表示する
前回はOracleからWebサイトにアクセスする方法を記載しましたが、今回はOracleからSOAP形式のWebサービスを利用する方法を記載します。
ACL設定まではWebサイトにアクセスする方法と同じですので、前回の記事を参考にしてください。
SOAPメッセージの作成
SOAPリクエストを送信するには、受け取る側のWebサービスが必要ですので、
サービスを使って記載していきます。
WebserviceX.NETComprehensive stock analysis, predictive analytics, and data APIs for financial data.Empowering traders and developers with AI-driven insights, historical data, and marke...
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メッセージをパースして取り出します。
