このエントリはMagento Advent Calendar 2019の8日目です。

今回は非同期・バルク処理APIを実際に使ってみましょう。
使う前に、前回説明したRabbitMQを必ずセットアップしておいてください。

非同期APIを使ってみよう

以前も取り上げましたが、非同期APIのエンドポイントは以下のように同期APIのエンドポイントに「async」を追加した形になります。

POST http(s)://ドメイン名/rest/async/V1/products

投げるデータの構成

非同期APIで投げるデータは同期APIのリファレンスにあるものと同じものを使用します。今回例にする商品登録APIの場合は、以下のデータを使用します。
※今回はシンプル商品を扱うことにします。環境によって商品属性の構成は異なるので、環境に合わせて適宜追加してください。 

{
  "product": {
    "sku": "test-item",
    "name": "テスト商品",
    "attribute_set_id": 4,
    "price": 1000,
    "status": 1,
    "visibility": 4,
    "type_id": "simple",
    "weight": 1,
    "extension_attributes": {
      "website_ids": [
        0
      ],
      "category_links": [
        {
          "position": 0,
          "category_id": "2"
        }
      ]
    }
   }
}

APIの実行と受付結果取得

では、最初はPOSTメソッドを使って商品を作ってみましょう。先程のデータを以下のURLに対してcurlで投げてみます。

curl -XPOST -H 'Authorization: Bearer トークン' -H 'Content-Type: application/json' -H 'Accept: application/json' http://ホスト名/rest/async/V1/products -d '先程のデータ’

成功すると、下記のような結果が得られます。 

{
  "bulk_uuid": "e69c9116-4e81-4bce-9442-48c8cf1cfede",
  "request_items": [
    {
      "id": 0,
      "data_hash": "ad187406ba386d5ce892256fb8bb10f4639ed0b8b930bb904655f13ba1277b94",
      "status": "accepted"
    }
  ],
  "errors": false
}

この時点では処理受付ができたことしかわからないのが非同期APIの特徴です。

結果取得APIの実行

それでは、処理結果を取得してみましょう。結果取得は以下のエンドポイントを使用します。 

curl -XGET -H 'Authorization: Bearer トークン' -H 'Content-Type: application/json' -H 'Accept: application/json' http://ホスト名/rest/V1/bulk/先程得られたbulk_uuid/status

結果取得のエンドポイントでは最初のリクエストの実行結果で得られたbulk_uuidを使用します。
ですから必ず非同期・バルク処理APIの実行結果で得られたbulk_uuidを記録するようにしてください。 

結果取得APIを実行すると、以下のような結果が得られます。

{
  "operations_list": [
    {
      "id": 173,
      "status": 1,
      "result_message": "Service execution success Magento\\Catalog\\Model\\ProductRepository\\Interceptor::save",
      "error_code": null
    }
  ],
  "user_type": 1,
  "bulk_id": "e69c9116-4e81-4bce-9442-48c8cf1cfede",
  "description": "Topic async.magento.catalog.api.productrepositoryinterface.save.post",
  "start_time": "2019-12-08 10:23:37",
  "user_id": 11,
  "operation_count": 1
}

この例では無事に商品登録ができたことを意味しています。
同期APIの場合は登録できた商品IDがすぐに得られますが、非同期APIの場合は結果取得APIを使用しない限り、実行結果を得ることはできません。 

バルク処理APIを使ってみよう

今度はバルク処理APIを実行してみましょう。
バルク処理APIのエンドポイントは以下のように非同期APIのエンドポイントに「bulk」を追加したものになります。

POST http(s)://ドメイン名/rest/async/bulk/V1/products

基本的にバルク処理APIでも投げるデータの形式はこれまでと同じなので、先程のデータをいくらか改変したデータを使うことにします。
ただ、バルク処理APIの場合は複数件の処理が1回でできるので、以下のような形でデータを投げます。

[{データ1},{データ2},{データ3}]

実行すると、以下のように1件のbulk_uuidが返り、結果取得できるようになります。

{
  "bulk_uuid": "9b3317e7-3fd7-443b-9e4b-fff3e7e36f8f",
  "request_items": [
    {
      "id": 0,
      "data_hash": "6818a19baf236211fc9ba9588129fba7bf92a2b701e73550b901d00625504b06",
      "status": "accepted"
    },
    {
      "id": 1,
      "data_hash": "903518c6fa683c01c049b1958b901ba0daab0ab023f9a65496f770046b58cb9f",
      "status": "accepted"
    },
    {
      "id": 2,
      "data_hash": "32280b7a5ea42e8a10f14c530362d0c4448717938fd7d54c0d48ed91a088b805",
      "status": "accepted"
    }
  ],
  "errors": false
}

先ほどと同じように結果取得APIにbulk_uuidをなげると、3件の実行結果が得られます。

{
  "operations_list": [
    {
      "id": 177,
      "status": 1,
      "result_message": "Service execution success Magento\\Catalog\\Model\\ProductRepository\\Interceptor::save",
      "error_code": null
    },
    {
      "id": 178,
      "status": 1,
      "result_message": "Service execution success Magento\\Catalog\\Model\\ProductRepository\\Interceptor::save",
      "error_code": null
    },
    {
      "id": 179,
      "status": 1,
      "result_message": "Service execution success Magento\\Catalog\\Model\\ProductRepository\\Interceptor::save",
      "error_code": null
    }
  ],
  "user_type": 1,
  "bulk_id": "9b3317e7-3fd7-443b-9e4b-fff3e7e36f8f",
  "description": "Topic async.magento.catalog.api.productrepositoryinterface.save.post",
  "start_time": "2019-12-08 10:59:04",
  "user_id": 11,
  "operation_count": 3
}

このように、バルク処理APIを使えば複数件のデータ登録・更新ができます。
同期・非同期APIと合わせて活用することで、これまでよりも件数の多いデータ更新に対応できるでしょう。