WEBリクエストを送信してレスポンスを表示する
OracleからWEBサイトやWEB APIなどのネットワークサービスを呼び出すには、UTL_HTTPパッケージを使用します。
今回は、UTL_HTTPパッケージを使用して、WEBサイトからのレスポンスを表示する方法を記載します。
環境
Oracle Express Edition 11g R2
UTL_HTTPパッケージとは?
UTL_HTTPパッケージは、SQLとPL/SQLからHypertext Transfer Protocol(HTTP)のコールアウトを行います。これを使用すると、HTTPを経由してインターネット上のデータにアクセスできます。
パッケージ使用時の注意事項
Oracleではネットワークサービスへのアクセスはデフォルトで無効に設定されており、アクセス制御リスト(ACL)によりネットワークアクセスが拒否されます。
今回のようにWEBサイトにアクセスするためには、まず最初にDBMS_NETWORK_ACL_ADMINパッケージを使用して、ACLを設定する必要があります。
UTL_TCP,UTL_SMTP,UTL_MAILパッケージなどを使用する場合も同じようにACLを設定します
また、今記事のようにOracle Express Editionを使用する場合には、DBAユーザでUTL_HTTPの実行権限を付与する必要があります。
/* 実行権限の付与 */ GRANT EXECUTE ON SYS.UTL_HTTP TO SCOTT;
ACLの設定
ユーザにネットワークアクセス権限を付与するには、DBAユーザでACLの作成、アサインを実行します。
/* ACLの作成 */ BEGIN DBMS_NETWORK_ACL_ADMIN.CREATE_ACL ( acl => 'www.xml', -- ACL名 description => 'web access acl', -- 説明 principal => 'SCOTT', -- ユーザ名/ロール名 is_grant => TRUE, -- 権限を付与するか否か privilege => 'connect'); -- UTL_HTTPパッケージの場合 END; / /* ACLのアサイン */ BEGIN DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'www.xml', -- ACL名 host => 'skill-note.net'); -- ホスト名/IPアドレス ワイルドカードで指定することも可 COMMIT; END; /
Webサイトにアクセスする
次にACLを付与したユーザでログインしてHTTPリクエストを送信します。
REQUESTファンクションを使用して2000バイト分のレスポンスを表示します。
SELECT UTL_HTTP.REQUEST('http://skill-note.net') FROM DUAL;
下記のようなレスポンスが表示されることを確認します。
UTL_HTTP.REQUEST('HTTP://SKILL-NOTE.NET') -------------------------------------------------------------------------------- <!DOCTYPE html> <!--[if lt IE 7]> <html class="ie6" lang="ja"> <![endif]--> <!--[if IE 7]> <html class="i7" lang="ja"> <![endif]--> <!--[if IE 8]> <html class="ie" lang="ja"> <![endif]--> <!--[if gt IE 8]><!--> <html lang="ja"> <!--<![endif]--> <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp .me/ns/article#"> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalabl e=no"> <meta name="format-detection" content="telephone=no" /> UTL_HTTP.REQUEST('HTTP://SKILL-NOTE.NET') --------------------------------------------------------------------------------
PL/SQLからHTTPリクエストを送信する場合。
/* PL/SQL REQUEST */ SET SERVEROUTPUT ON BEGIN DBMS_OUTPUT.PUT_LINE(UTL_HTTP.REQUEST('http://skill-note.net')); END; /
下記のようなレスポンスが表示されることを確認します。
/* PL/SQL REQUEST */ SET SERVEROUTPUT ON BEGIN DBMS_OUTPUT.PUT_LINE(UTL_HTTP.REQUEST('http://skill-note.net')); END; /
全てのレスポンスを取得したい場合は、GET_RESPONSEファンクションを使用します。
GET_RESPONSEで取得したHTTPレスポンスを一行毎表示します。
/* PL/SQL GET_RESPONSE */ SET SERVEROUTPUT ON DECLARE req UTL_HTTP.REQ; resp UTL_HTTP.RESP; value VARCHAR2(1024); BEGIN req := UTL_HTTP.BEGIN_REQUEST('http://skill-note.net'); UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/5.0'); resp := UTL_HTTP.GET_RESPONSE(req); LOOP UTL_HTTP.READ_LINE(resp, value, TRUE); DBMS_OUTPUT.PUT_LINE(value); END LOOP; UTL_HTTP.END_RESPONSE(resp); EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN UTL_HTTP.END_RESPONSE(resp); END; /
ACL設定を削除する
今回作成したACLを削除するにはDBAユーザで下記を実行します。
/* ACLの削除 */ BEGIN DBMS_NETWORK_ACL_ADMIN.DROP_ACL(acl => 'www.xml'); END; /
WEB API、WEBサービスを利用する方法は下記の記事に記載しています。
この記事は、下記のページを参考にして記載しています。
[amazonjs asin=”4797377070″ locale=”JP” title=”プロとしてのOracle PL/SQL入門 【第3版】(Oracle 12c、11g、10g対応) (Oracle現場主義)”]