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