Autonomous DatabaseからのWebサービスの呼出し
Autonomous DatabaseからWebサービスを呼び出すオプションについて説明します。
Autonomous DatabaseからWebサービスを呼び出すためのオプションは、次のとおりです:
-
DBMS_CLOUD
REST APIの使用:DBMS_CLOUD.SEND_REQUEST
関数は、HTTPリクエストを開始し、レスポンスを取得し、レスポンスを終了します。 この関数は、引数を指定してクラウドREST APIリクエストを送信するためのワークフローを提供し、ファンクションはレスポンス・コードとペイロードを返します。 詳細については、「SEND_REQUESTファンクションおよびプロシージャ」を参照してください。 -
Oracle APEXの使用: Autonomous DatabaseインスタンスのAPEXから、SOAPとRESTfulの両方のスタイルのwebサービスと対話できます。 詳細については、「Oracle APEXでのWebサービスの使用」を参照してください。
-
パブリック・サイトにリクエストを送信するには、
UTL_HTTP
を使用: 詳細については、「パブリック・ホストへのHTTPリクエストの送信」を参照してください。 -
UTL_HTTP
を使用して、プライベート・サイトにリクエストを送信: 詳細については、「プライベート・ホストへのHTTPリクエストの送信」を参照してください。Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合は、
UTL_HTTP
,DBMS_LDAP
,UTL_SMTP
またはUTL_TCP
のプロシージャで顧客管理ウォレットを使用できます。 詳細については、「顧客管理のWalletを使用した外部コールの作成」を参照してください。
Autonomous DatabaseのUTL_HTTP
の制限の詳細は、「Autonomous DatabaseのPL/SQLパッケージ・ノート」を参照してください。
トピック
- パブリック・ホストへのHTTPリクエストの送信
UTL_HTTP
を使用してパブリック・ホストでHTTPリクエストを送信するための詳細を提供します。 - プライベート・ホストへのHTTPリクエストの送信
UTL_HTTP
を使用してプライベート・ホストでHTTPリクエストを送信するステップについて説明します。 - プロキシを使用したプライベート・サイトへのHTTPリクエストの送信
Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合、プロキシを使用してUTL_HTTP
でHTTPリクエストを送信できます。 - 資格証明オブジェクトを使用したHTTP認証の設定
資格証明オブジェクトをUTL_HTTP.SET_CREDENTIAL
プロシージャに渡す方法について説明します。 - Oracle APEXまたはデータベース・アクションを使用したHTTPリクエストの送信に関するノート
Oracle APEX SQLコマンドまたはデータベース・アクションのSQLワークシートを使用して複数の順次SQLコマンドを実行する場合、コマンドは、前の文の状態を保存しない異なるデータベース・セッションで実行できます。 この動作は、データベースへの永続的な接続を維持するデスクトップSQLクライアント(SQL*PlusやSQL Developerなど)とは異なります。
親トピック: タスク
パブリック・ホストへのHTTPリクエストの送信
UTL_HTTP
を使用してパブリック・ホストでHTTPリクエストを送信するための詳細を提供します。
たとえば、パブリック・ホストwww.example.comのHTTPリクエストを送信するには、ホストのアクセス制御リストを作成します:
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'www.example.com',
ace => xs$ace_type( privilege_list => xs$name_list('http'),
principal_name => 'ADMIN',
principal_type => xs_acl.ptype_db));
END;
次に、HTTPリクエストを送信します:
SELECT UTL_HTTP.REQUEST(url => 'https://www.example.com/') FROM dual;
ノート:
Autonomous Databaseインスタンスがプライベート・エンドポイントにあり、パブリック・ホストへのUTL_HTTP
コールをプライベート・エンドポイントVCNエグレス・ルールの対象にする場合は、ROUTE_OUTBOUND_CONNECTIONS
データベース・プロパティをPRIVATE_ENDPOINT
に設定します。
詳細については、「プライベート・エンドポイントを使用したアウトバウンド接続のセキュリティの強化」を参照してください。
Autonomous DatabaseのUTL_HTTP
の制限の詳細は、「Autonomous DatabaseのPL/SQLパッケージ・ノート」を参照してください。
プライベート・ホストへのHTTPリクエストの送信
UTL_HTTP
を使用してプライベート・ホストでHTTPリクエストを送信するステップについて説明します。
プライベート・エンドポイント上のターゲット・ホストにリクエストを送信するには、ソース・データベースのOracle Cloud Infrastructure VCNからターゲット・ホストにアクセスできる必要があります。 たとえば、次の場合にターゲット・ホストに接続できます:
-
ソース・データベースとターゲット・ホストの両方が、同じOracle Cloud Infrastructure VCN内にあります。
-
ソース・データベースとターゲット・ホストは、ペアになっている異なるOracle Cloud Infrastructure VCNにあります。
-
ターゲット・ホストは、FastConnectまたはVPNを使用してソース・データベースOracle Cloud Infrastructure VCNに接続されているオンプレミス・ネットワークです。
Autonomous Databaseがプライベート・エンドポイントにある場合は、顧客管理ウォレットを使用してUTL_HTTP
コールを行うこともできます。 詳細については、「顧客管理のWalletを使用した外部コールの作成」を参照してください。
プライベート・エンドポイント上のターゲットへのUTL_HTTP
リクエストを行うには:
-
ホストのアクセス制御リストを作成します。
たとえば:
BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => 'www.example.com', ace => xs$ace_type( privilege_list => xs$name_list('http'), principal_name => 'ADMIN', principal_type => xs_acl.ptype_db), private_target => TRUE); END; /
この例に示すように、ホストのアクセス制御リストを作成するときに、
private_target
パラメータに値TRUE
を指定します。ノート:
ROUTE_OUTBOUND_CONNECTIONS
をPRIVATE_ENDPOINT
に設定すると、このAPIではprivate_target
パラメータをTRUE
に設定する必要はありません。 詳細については、「プライベート・エンドポイントを使用したアウトバウンド接続のセキュリティの強化」を参照してください。 -
HTTPリクエストを送信します:
SELECT UTL_HTTP.REQUEST( url => 'https://www.example.com/', https_host => 'www.example.com') FROM dual;
Autonomous DatabaseのUTL_HTTP
の制限の詳細は、「Autonomous DatabaseのPL/SQLパッケージ・ノート」を参照してください。
プロキシを使用したプライベート・サイトへのHTTPリクエストの送信
Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合、プロキシを使用してUTL_HTTP
でHTTPリクエストを送信できます。
Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合、ターゲット・プロキシでUTL_HTTP
を使用するには、ソース・データベースのOracle Cloud Infrastructure VCNからターゲット・プロキシにアクセスできる必要があります。
たとえば、次の場合にプロキシを使用して接続できます:
-
ソース・データベースとプロキシ・サーバーの両方が同じOracle Cloud Infrastructure VCNにあります。
-
ソース・データベースとプロキシ・サーバーは、ペアになっている異なるOracle Cloud Infrastructure VCNにあります。
-
プロキシ・サーバーは、FastConnectまたはVPNを使用してソース・データベースのOracle Cloud Infrastructure VCNに接続されているオンプレミス・ネットワークです。
顧客管理ウォレットを使用してUTL_HTTP
コールを行うこともできます。 詳細については、「顧客管理のWalletを使用した外部コールの作成」を参照してください。
UTL_HTTP
でプロキシ・サーバーを使用するには:
UTL_HTTP.SET_PROXY
を使用してプロキシ・サーバーを設定するためのノート:
-
DBMS_CLOUD
リクエストは、UTL_HTTP.SET_PROXY
で設定したプロキシ・サーバーには対応しません。 これには、DBMS_CLOUD.SEND_REQUEST
およびDBMS_CLOUD.CREATE_EXTERNAL_TABLE
、DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE
またはDBMS_CLOUD.CREATE_HYBRID_PART_TABLE
で定義したDBMS_CLOUD
外部表に対するすべてのオブジェクト・ストレージ・アクセスが含まれます。 -
APEX_WEB_SERVICE
リクエストは、UTL_HTTP.SET_PROXY
で設定したプロキシ・サーバーには対応しません。
Autonomous DatabaseのUTL_HTTP
の制限の詳細は、「Autonomous DatabaseのPL/SQLパッケージ・ノート」を参照してください。
資格証明オブジェクトを使用したHTTP認証の設定
資格証明オブジェクトをUTL_HTTP.SET_CREDENTIAL
プロシージャに渡す方法について説明します。
UTL_HTTP.SET_CREDENTIAL
プロシージャは、HTTPリクエスト・ヘッダーにHTTP認証情報を設定します。 Webサーバーが要求を認証するにはこの情報が必要です。
UTL_HTTP.SET_CREDENTIAL
プロシージャを使用すると、資格証明オブジェクトを渡してHTTP認証を設定できます。 資格証明オブジェクトはスキーマ・オブジェクトであるため、アクセスできるのは特権ユーザーのみで、資格証明を制御するためのスキーマ・レベルの権限を構成できます。 資格証明オブジェクトの受渡しは、認証に使用されるusername/password/keysを格納および管理するための適切で安全な方法です。
UTL_HTTP.SET_CREDENTIAL
プロシージャは、UTL_HTTP.SET_AUTHENTICATION
プロシージャに代わる安全で便利な方法です。
例
...
UTL_HTTP.SET_AUTHENTICATION (l_http_request, 'web_app_user', 'xxxxxxxxxxxx');
...
前述の例に示すように、SET_AUTHENTICATION
プロシージャを起動するときに、PL/SQLの仮パラメータの一部として、ユーザー名とパスワードをクリア・テキストで渡す必要があります。 様々なPL/SQL自動化またはcronスクリプトにユーザー名/パスワードを埋め込む必要がある場合があります。 クリア・テキスト・パスワードを渡すことは、 UTL_HTTP.SET_CREDENTIAL
プロシージャで対処されるコンプライアンスの問題です。
詳細については、「SET_AUTHENTICATIONプロシージャ」と「SET_AUTHENTICATION_FROM_WALLETプロシージャ」を参照してください。
UTL_HTTP.SET_CREDENTIAL
構文
UTL_HTTP.SET_CREDENTIAL (
r IN OUT NOCOPY req,
credential IN VARCHAR2,
scheme IN VARCHAR2 DEFAULT 'Basic',
for_proxy IN BOOLEAN DEFAULT FALSE);
SET_CREDENTIAL
プロシージャで資格証明オブジェクトを渡す例:
-
資格証明オブジェクトを作成します:
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'HTTP_CRED', username => 'web_app_user', password => '<password>' ); END;
これにより、格納されたユーザー名/パスワードのペアを作成する資格証明オブジェクトが作成されます。
詳細については、「CREATE_CREDENTIALプロシージャ」を参照してください。
詳細については、「スケジューラ・ジョブ資格証明の指定」を参照してください。
-
UTL_HTTP.SET_CREDENTIAL
プロシージャを起動します:DECLARE l_http_request UTL_HTTP.REQ; BEGIN l_http_request := UTL_HTTP.BEGIN_REQUEST('https://www.example.com/v1/dwcsdev/NAME/dwcs_small_xt1.csv'); UTL_HTTP.SET_CREDENTIAL (l_http_request, 'HTTP_CRED','BASIC'); ... END;
この例では、最初に
BEGIN_REQUEST
プロシージャを起動してリクエストを作成し、SET_CREDENTIAL
プロシージャを起動してHTTPリクエスト・ヘッダーにHTTP認証情報を設定します。 Webサーバーが要求を認証するにはこの情報が必要です。 値l_http_request
はHTTPリクエスト、HTTP_CRED
は資格証明名、BASIC
はHTTP認証スキームです。
詳細については、UTL_HTTPを参照してください。
Autonomous DatabaseのUTL_HTTP
の制限の詳細は、「Autonomous DatabaseのPL/SQLパッケージ・ノート」を参照してください。
Oracle APEXまたはデータベース・アクションを使用したHTTPリクエストの送信に関するノート
Oracle APEX SQLコマンドまたはデータベース・アクションのSQLワークシートを使用して複数の順次SQLコマンドを実行する場合、コマンドは、前の文の状態を保存しない異なるデータベース・セッションで実行できます。 この動作は、データベースへの永続的な接続を維持するデスクトップSQLクライアント(SQL*PlusやSQL Developerなど)とは異なります。
Oracle APEX Autonomous DatabaseインスタンスへのSQLコマンドおよびデータベース・アクションのSQLワークシートの発行はステートレスです。 つまり、個々のSQL文およびPL/SQL文を実行すると、ウォレットを使用するコマンドを発行する場合など、データベース・メモリーの状態が節約されますが、次の文を実行する前に状態がクリアされる場合があります。
Autonomous Databaseに発行するSQLコマンドの文実行間でデータベース・メモリーの状態を保持するステップは、次の表を参照してください。
SQLコマンド・ツール | 文書をブロックとして発行 |
---|---|
データベース・アクションSQLワークシート |
|
Oracle APEX SQLコマンド |
APEX SQLコマンドでは、個々の文の実行のみがサポートされます。 複数の文を実行する場合は、1つのPL/SQL無名ブロックで文をラップする必要があります。 APEX SQLコマンドを使用してブロックを実行するには、「実行」をクリックします。 |
たとえば、次のコード・ブロックを使用して、顧客管理Walletを使用するutl_http.request()
コマンドを実行します:
SELECT utl_http.request(url => 'https://api.example.com/', wallet_path => 'file:path_to_wallet', wallet_password => 'password' ) FROM DUAL";
これを、1つのコード・ブロックとしてではなく、utl_http.set_wallet()
コマンドとutl_http.request()
文を個別に実行すると失敗する可能性がある2つの連続する文で実行と比較します:
EXEC utl_http.set_wallet('file:WALLET_DIR/wallet.sso', 'password');
SELECT utl_http.request('https://api.example.com/') FROM DUAL;