REST API の実行

Thing SDK Embedded では、任意の REST API を実行する機能を提供しています。Thing SDK Embedded でサポートされていない機能でも、REST API を実行することによって利用することができます。

REST API の実行に必要なパラメーターは、REST リファレンスガイド の curl コマンドや、詳細ドキュメント の API 仕様をご覧ください。

ここでは、Object の検索を行う REST API の curl コマンドを、Thing SDK Embedded によって実行する例を示します。

curl -v -X POST \
  -H "Authorization: Bearer {ACCESS_TOKEN}" \
  -H "X-Kii-AppID: {APP_ID}" \
  -H "X-Kii-AppKey: {APP_KEY}" \
  -H "Content-Type: application/vnd.kii.QueryRequest+json" \
  "https://api-jp.kii.com/api/apps/{APP_ID}/things/VENDOR_THING_ID:{VENDOR_THING_ID}/buckets/myBucket/query" \
  -d '{
       "bucketQuery": {
         "clause": {
           "type": "range", "field": "temperature",
           "lowerLimit": 20
         },
         "orderBy": "temperature", "descending": false
       },
       "bestEffortLimit": 5
     }'

これは、REST API で Object の検索を行うコマンドの例です。ここでは、Thing スコープ上で temperature が 20 以上の Object を降順で最大 5 件ずつ取得する条件を指定しています。REST API の仕様の詳細は KiiObject の検索 をご覧ください。

今回の例に挙げた bestErrortLimit のように通信量に影響するパラメーターは、SDK の初期化の際に指定した バッファー kii.kii_core.http_context のサイズを考慮しながら決定してください。レスポンスの通信データがバッファーに入りきらない場合はエラーとなります。

この curl コマンドと同等の処理を SDK から実行するには、次のようなコードを実装します。

int ret;

#define RESOURCE_PATH "/api/apps/" EX_APP_ID "/things/VENDOR_THING_ID:rBnvSPOXBDF9r29GJeGS/buckets/myBucket/query"
#define CONTENT_TYPE "application/vnd.kii.QueryRequest+json"

/* Start to create a REST API request. */
ret = kii_api_call_start(&kii, "POST", RESOURCE_PATH, CONTENT_TYPE, KII_TRUE);
if (ret != 0) {
  /* Handle the error. */
  return;
}

/* Set HTTP headers if needed. */
/* ret = kii_api_call_append_header(&kii, "X-MY-HEADER1", "MyHeaderValue"); */
/* ret = kii_api_call_append_header(&kii, "X-MY-HEADER2", "MyHeaderValue"); */

#define HTTP_BODY "{" \
                  "  \"bucketQuery\": {" \
                  "    \"clause\": {" \
                  "      \"type\": \"range\", \"field\": \"temperature\"," \
                  "      \"lowerLimit\": 20" \
                  "    }," \
                  "    \"orderBy\": \"temperature\", \"descending\": false" \
                  "  }," \
                  "  \"bestEffortLimit\": 5" \
                  "}"

/* Append the request body. */
ret = kii_api_call_append_body(&kii, HTTP_BODY, strlen(HTTP_BODY));
if (ret != 0) {
  /* Handle the error. */
  return;
}

/* Send the created REST API request. */
ret = kii_api_call_run(&kii);
if (ret != 0) {
  /* Handle the error. */
  return;
}

printf("status:%d\n", kii.kii_core.response_code);
printf("result:%s\n", kii.kii_core.response_body);

REST API の実行時は、Thing SDK Embedded の次の API を順に呼び出します。

  • kii_api_call_start()

    初めに、REST API の定義を開始するための関数を呼び出します。引数には次の値を指定します。

    • kii_t

      初期化済みの kii_t を指定します。

      今回の例では検索の実行時にアクセストークンが必要なため、kii_t に Thing のアクセストークンが設定済みになっている想定です。

    • HTTP の動詞

      REST API で使用する HTTP の動詞(GET/POST など)を指定します。ここでは、curl コマンドのパラメーターを元に、POST を指定しています。

    • リソースパス

      REST API のアクセス先 URL のパスを指定します。curl コマンドのアクセス先 URL から、サーバー名を除いた残りのパスを指定します。

      なお、このサンプルでは、vendorThingID rBnvSPOXBDF9r29GJeGS の Thing スコープ の Bucket にアクセスしています。kii_t に、この Thing のアクセストークンが設定されている前提です。

    • Content-Type

      REST API の HTTP リクエストで使用する Content-Type です。リファレンスガイドの curl コマンドの例に Content-Type の指定がない場合は、詳細ドキュメント をご確認ください。

    • Authorization ヘッダーの有無

      KII_TRUE を指定すると、Authorization ヘッダーに kii_t から取得したアクセストークンを設定します。KII_FALSE を指定した場合は、リクエストに Authorization ヘッダーを追加せず匿名アクセスを行います。

  • kii_api_call_append_header()

    特殊な HTTP ヘッダーが必要な REST API では、この関数で HTTP ヘッダーを追加できます。不要な場合、この関数を呼び出す必要はありません。

  • kii_api_call_append_body()

    HTTP ボディーを追加します。GET メソッドを利用する場合、呼び出しは不要です。

    引数として、HTTP ボディーに指定する文字列やバイナリデータへのポインタと、その長さを指定します。複数回に分けて追加することができますが、リクエスト全体のサイズが kii.kii_core.http_context に指定したサイズを超えるとエラーになります。

    追加した HTTP ボディーの長さに応じて、Content-Length ヘッダーが自動的に設定されます。

  • kii_api_call_run()

    必要なデータを用意した後、この関数を呼び出すと Kii Cloud にリクエストを行います。

REST API の実行の結果は kii_t 構造体より取得できます。kii.kii_core.response_code からは HTTP のステータスコードが、kii.kii_core.response_body からは HTTP ボディーのデータが、それぞれ取得できます。

サンプルコードに示した検索の例の場合、HTTP ボディーのテキストデータは、REST API の仕様に基づいて以下のような結果となります。プログラムから使用するには、JSON の解析 に示す kii_json ライブラリーを使ってフィールド値を取得できます。

{
  "queryDescription": "WHERE ( 20 <= temperature ) ORDER BY temperature ASC",
  "results": [
    {
      "_created": 1465959304473,
      "_id": "8f7ce090-32a4-11e6-b38c-22000a7f900d",
      "_modified": 1465959304473,
      "_owner": "702b5ba64301b42bc82318ae5a0459b3",
      "_version": "1",
      "power": true,
      "status": "ECO-MODE",
      "temperature": 22
    },
    {
      "_created": 1465959311501,
      "_id": "93ad43d0-32a4-11e6-83ca-22000aaf0c30",
      "_modified": 1465959311501,
      "_owner": "702b5ba64301b42bc82318ae5a0459b3",
      "_version": "1",
      "power": true,
      "status": "NORMAL",
      "temperature": 28
    }
  ]
}