0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle APEXでREST APIを呼び出す方法

0
Posted at

Oracle APEXでREST APIを呼び出す方法 - APEX_WEB_SERVICE実践ガイド

はじめに

Oracle APEXで開発していると、外部システムとの連携が必要になることがよくあります。

例えば、

  • 顧客管理システム(CRM)からデータ取得
  • OCI Object Storageへのファイルアップロード
  • SlackやTeamsへの通知
  • 外部認証サービスとの連携
  • 他システムへのデータ送信

このような場合、REST APIを呼び出す必要があります。

Oracle APEXには標準で APEX_WEB_SERVICE パッケージが用意されており、PL/SQLから簡単にREST APIを利用できます。

本記事では以下を紹介します。

  • GET API
  • POST API
  • リクエストヘッダー設定
  • JSONレスポンス解析
  • エラーハンドリング
  • 実務で役立つベストプラクティス

APEX_WEB_SERVICEとは

APEX_WEB_SERVICE はOracle APEXが提供するパッケージであり、外部のREST APIやSOAP Web Serviceを呼び出すことができます。

最もよく利用されるのが以下のメソッドです。

APEX_WEB_SERVICE.MAKE_REST_REQUEST

構文:

l_response := APEX_WEB_SERVICE.MAKE_REST_REQUEST(
    p_url         => l_url,
    p_http_method => 'GET'
);

戻り値はCLOBです。


GET APIを呼び出す

まずは最もシンプルなGETリクエストです。

今回はサンプルAPIとしてJSONPlaceholderを利用します。

https://jsonplaceholder.typicode.com/users/1

サンプルコード

DECLARE
    l_response CLOB;
BEGIN

    l_response :=
        APEX_WEB_SERVICE.MAKE_REST_REQUEST(
            p_url         => 'https://jsonplaceholder.typicode.com/users/1',
            p_http_method => 'GET'
        );

    DBMS_OUTPUT.PUT_LINE(l_response);

END;
/

実行結果:

{
  "id":1,
  "name":"Leanne Graham",
  "username":"Bret"
}

HTTPステータスコードを取得する

API実行後は必ずステータスコードを確認しましょう。

DECLARE
    l_response CLOB;
BEGIN

    l_response :=
        APEX_WEB_SERVICE.MAKE_REST_REQUEST(
            p_url         => 'https://jsonplaceholder.typicode.com/users/1',
            p_http_method => 'GET'
        );

    DBMS_OUTPUT.PUT_LINE(
        'Status=' || APEX_WEB_SERVICE.G_STATUS_CODE
    );

END;
/

結果:

Status=200

よく利用するステータス:

Code Meaning
200 Success
201 Created
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
500 Internal Server Error

リクエストヘッダーを設定する

多くのAPIでは認証トークンやContent-Typeの指定が必要です。

ヘッダーは

APEX_WEB_SERVICE.G_REQUEST_HEADERS

を使用します。

例:

BEGIN

    APEX_WEB_SERVICE.G_REQUEST_HEADERS.DELETE;

    APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).name :=
        'Authorization';

    APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).value :=
        'Bearer xxxxxxxxx';

    APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).name :=
        'Content-Type';

    APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).value :=
        'application/json';

END;
/

POST APIを呼び出す

データ作成APIを呼び出す場合です。

送信JSON

{
  "title":"Qiita",
  "body":"Oracle APEX",
  "userId":1
}

サンプルコード

DECLARE

    l_response CLOB;
    l_body     CLOB;

BEGIN

    l_body :=
    '{
        "title":"Qiita",
        "body":"Oracle APEX",
        "userId":1
     }';

    APEX_WEB_SERVICE.G_REQUEST_HEADERS.DELETE;

    APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).name :=
        'Content-Type';

    APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).value :=
        'application/json';

    l_response :=
        APEX_WEB_SERVICE.MAKE_REST_REQUEST(
            p_url         => 'https://jsonplaceholder.typicode.com/posts',
            p_http_method => 'POST',
            p_body        => l_body
        );

    DBMS_OUTPUT.PUT_LINE(l_response);

END;
/

JSONレスポンスを解析する

戻り値はCLOBなので、JSON_OBJECT_Tで解析できます。

APIレスポンス:

{
  "id":1,
  "name":"John"
}

解析:

DECLARE

    l_response CLOB;
    l_json     JSON_OBJECT_T;

BEGIN

    l_response :=
        APEX_WEB_SERVICE.MAKE_REST_REQUEST(
            p_url         => 'https://jsonplaceholder.typicode.com/users/1',
            p_http_method => 'GET'
        );

    l_json := JSON_OBJECT_T.parse(l_response);

    DBMS_OUTPUT.PUT_LINE(
        l_json.get_string('name')
    );

END;
/

結果:

John

OCI Object Storageでよく使う例

OCI Object Storageとの連携では以下のような実装になります。

APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).name :=
    'Authorization';

APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).value :=
    'Bearer ' || l_token;

ファイルアップロード:

APEX_WEB_SERVICE.MAKE_REST_REQUEST(
    p_url         => l_upload_url,
    p_http_method => 'PUT',
    p_body_blob   => l_blob
);

ファイル削除:

APEX_WEB_SERVICE.MAKE_REST_REQUEST(
    p_url         => l_delete_url,
    p_http_method => 'DELETE'
);

このあたりはOCI連携を行う際によく利用します。


エラーハンドリング

実務では必須です。

DECLARE

    l_response CLOB;

BEGIN

    l_response :=
        APEX_WEB_SERVICE.MAKE_REST_REQUEST(
            p_url         => l_url,
            p_http_method => 'GET'
        );

    IF APEX_WEB_SERVICE.G_STATUS_CODE != 200 THEN

        RAISE_APPLICATION_ERROR(
            -20001,
            'API Error : '
            || APEX_WEB_SERVICE.G_STATUS_CODE
        );

    END IF;

EXCEPTION

    WHEN OTHERS THEN

        DBMS_OUTPUT.PUT_LINE(
            SQLERRM
        );

END;
/

ベストプラクティス

1. ステータスコードを必ず確認する

APEX_WEB_SERVICE.G_STATUS_CODE

をチェックする。


2. ヘッダーは毎回初期化する

APEX_WEB_SERVICE.G_REQUEST_HEADERS.DELETE;

前回実行の値が残ることがあります。


3. URLパラメータはエンコードする

ファイル名や日本語を含む場合:

UTL_URL.ESCAPE(
    l_file_name,
    TRUE,
    'UTF-8'
)

を利用する。


4. タイムアウトを考慮する

外部APIは必ずしも高速とは限りません。

大量データ取得時はバッチ処理化を検討しましょう。


まとめ

Oracle APEXでは APEX_WEB_SERVICE を利用することで簡単にREST APIを呼び出すことができます。

よく利用する機能は以下です。

  • GET
  • POST
  • PUT
  • DELETE
  • Authorization Header
  • JSON Parsing
  • Status Code Check

OCI Object Storageや外部サービス連携を行う際には必須の知識になるため、ぜひ活用してみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?