12. API Gateway

ここでは、API Gateway に登録したカスタム REST API を呼び出す方法について説明します。

12.1. CustomApi インスタンスの生成

API 呼び出し前に CustomApi インスタンスを生成します。 以下に例を示します。

var sayHello = new Nebula.CustomApi("hello", "GET", "sayHello");

コンストラクタには3つの引数を指定します。

  • 第1引数: カスタムAPIの名前を指定します
  • 第2引数: HTTP メソッドを文字列で指定します。GET, POST, PUT, DELETE のいずれかを指定します。
  • 第3引数: カスタムAPI のサブパスを指定します。

12.2. API の実行

APIを呼び出すには execute() を使用します。

sayHello.execute({name: "Taro Nichiden"})
    .then(function(response) {
        // 成功時の処理
        // response: レスポンス
    })
    .catch(function(error) {
        // 失敗時の処理
        // errorにはエラー要因がJSON 形式で返る。内容は以下のとおり。
        //  - status        : ステータスコード
        //  - statusText    : エラーメッセージ
        //  - responseText  : レスポンスメッセージ
    });

12.2.1. リクエストデータの指定

execute の引数には、サーバに引き渡すデータを指定します。 データの指定方法は、HTTP メソッドにより異なります。

メソッドが GET/DELETE の場合は、データはクエリパラメータに格納されます。 データは JSON Object として用意してください。キー・値がそれぞれクエリパラメータの名前・値となります。

メソッドが POST/PUT の場合は、データはリクエストボディに格納されます。

  • 文字列を指定した場合は、文字列がそのままボディに格納されます。
  • Object を指定した場合は、JSON文字列に変換されます。
  • Blob および Buffer を指定した場合は、バイナリデータが格納されます。

Content-Type を指定したい場合は、setContentType で指定します。 以下に JSON を送信する場合の例を示します。

var api = new Nebula.CustomApi("api1", "GET", "method1")
    .setContentType("application/json");

api.execute({key1: 100, key2: 200})
   .then(...)

12.2.2. レスポンスデータの受信

API呼び出しが成功した場合は、then() でレスポンスを受信します。

  • 受信データがテキストデータ(JSON含む)だった場合は文字列でレスポンスが渡されます。
  • 受信データがバイナリデータだった場合は、Blob (ブラウザの場合)または Buffer (Node.jsの場合)オブジェクトが渡されます。

バイナリデータを受信したい場合は、API呼び出し時に setBinaryResponse() を指定する必要があります。 以下に例を示します。

var api = new Nebula.CustomApi("api1", "GET", "get_file")
    .setBinaryResponse();

api.execute({filename: "file1.jpg"})
    .then(function(response) {
        // response は blob または buffer
    })
    .catch(function(error) {
        ...
    });

注意

バイナリでデータを受け取る場合、エラー発生時はステータスコードのみが取得可能です。 (ステータステキストやレスポンステキストは取得不可)

12.2.3. レスポンスヘッダの受信

レスポンスヘッダを合わせて受信したい場合は、setReceiveResponseHeaders() を実施する 必要があります。また、then() で受け取るレスポンスの形式が変更になります。

以下に例を示します。

var api = new Nebula.CustomApi("hello", "GET", "sayHello")
    .setReceiveResponseHeaders(true); // レスポンスヘッダを受信する設定

api.execute({filename: "file1.jpg"})
    .then(function(response) {
        var body = response.body; // ボディ
        var headers = response.headers; // ヘッダ
        var contentType = headers["content-type"];
        ...
    })
    .catch(function(error) {
        ...
    });

上記の通り、then() で受け取るレスポンスは、以下のようなオブジェクトとなります。 headers に格納されるヘッダ名は全て小文字に正規化されます。

{
    body: ...,  // ボディ(文字列, JSON, blob, buffer など)
    headers: {  // ヘッダ
        "content-type": "application/json",
        ...
    }
}

12.2.4. Rawデータ受信

Node.js の場合、Bufferにデータを蓄積せずに、ダウンロードデータを逐次処理することができます。 メモリが少ない環境や、ファイルサイズが大きい場合に適しています。

以下は逐次ファイルに書き込む場合の例です。

const fs = require('fs');

// pipe を使用する場合
var writable = fs.createWriteStream("localfile.jpg");
customApi.executeRaw()
    .then((message) => {
        message.pipe(writable);
    })
    .catch(function(error) {
        // エラー時の処理
    });

// data を実装する場合
customApi.executeRaw()
    .then((message) => {
        message.on('data', () => {....});
        message.on('end', () => {....});
        message.on('error', () => {....});
        message.on('close', () => {....});
    })
    .catch(function(error) {
        // エラー時の処理
    });