【Shopify API】GraphQLとREST の徹底比較

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る
rest-graphql-thumnail

この記事の所要時間:11分

ShopifyではRESTとGraphQL両方のAPIが用意されていますが、ShopifyはGraphQLの活用を推し進めていくとしています。

Shopify is really betting on GraphQL
(ShopifyはGraphQLに賭けています)

https://www.shopify.com/partners/blog/getting-started-with-graphql

実際、ShopifyにおいてはGraphQL APIでしかアクセスできない機能がいくつか存在します。

また、APIのアクセス制限もGraphQL APIの方が引っかかりにくい仕組みになっています。

そのため、Shopify開発においてはGraphQL APIを活用することが重要になってきます。

一方、日本ではGraphQLがあまり浸透していないため、REST APIを利用した方がメリットが大きいケースもあるでしょう。

この記事では、ShopifyにおけるREST APIとGraphQL APIを様々な観点から比較していきます。

あなたがどちらを利用するか迷っているなら、参考になるはずです。

REST APIとGraphQL APIの比較

まずは、Shopifyに限らず、REST APIとGraphQL APIの比較を行います。

REST APIGraphQL API
通信プロトコルHTTPHTTP
ペイロードの形式(主に)JSON(主に)JSON
エンドポイント複数1つ
型付け弱い強い
データ操作の種類GET/POST/PUT/DELETEQuery/Mutation
データ取得の柔軟性低い高い
クライアントからサーバへのリクエストの数クライアントの要望に応じて複数回のリクエストが送られることがしばしばある。必要なデータを過不足なく指定することで、1回のリクエストで済ませる。

通信プロトコルはどちらもHTTPを使い、ペイロードがJSON形式であることは変わりません。

ペイロードとは
APIでやりとりされるデータ本体のこと。

REST APIはリソースにつき1つのエンドポイントが対応するので、複数のエンドポイントが実装されます。
一方のGraphQLは、エンドポイントが1つしかありません。

また、REST APIではJSONで定義された型でデータを型付けしますが、
GraphQL APIでは、Schemaで独自の型を定義します。

REST APIではクライアントは必要なデータを取得するために複数のエンドポイントにリクエストを送ることがしばしばあります。
一方、GraphQLは必要なデータだけを指定することができるので、1回のリクエストで済ませることができます。

まとめると、データが複雑に関係し合うようなケースでは、RESTよりもGraphQLのほうが適しています。

クライアントは柔軟なクエリを投げることができ、サーバはクライアントの複雑な要求を気にすることなくAPIを実装できます。

Shopifyのストアは、顧客や商品数が多くなるとそれだけ求められるカスタマイズや最適化が増え、扱うデータが複雑になります。

アプリに関しては、扱うAPIの種類やデータの種類によっては、複雑になることがあります。

そのような場合では、GraphQL APIを利用することをおすすめします。

RESTとGraphQLがアクセスできるAPIの比較

RESTとGraphQLがアクセスできるAPIを表にしました。

RESTGraphQL
Admin API
Storefront API×
Partner API×
Marketing activities API×
Ajax API×

RESTはAdmin APIのほとんどの機能にアクセスできますが(Admin APIに含まれる)Translation APIsにはアクセスできません。

また、一括処理(bulk operations)や、ベータ版の機能などもRESTではアクセスできません。

Storefront APIは完全にGraphQLでしかアクセスできません。

Shopifyパートナーが、マーチャントの管理や売上計算に使えるPartner APIもGraphQLでしかアクセスできません。

Marketing activities APIは、マーケティング活動の追跡や管理をするアプリ開発に使います。
これはRESTでのみアクセス可能です。

Ajax APIはテーマ開発に利用する簡易なAPIですが、RESTでのみ提供されています。

GraphQLとRESTに対するアクセス制限の比較

Shopify APIのアクセス制限は、リーキーバケットアルゴリズムに基づいて実装されています。

しかし、アクセス制限の元になる値は異なります。

結論から言うと、同様のことを成し遂げる場合でも、RESTよりGraphQLの方がアクセス制限に引っかかりにくくなっています。

この章では、はじめに、リーキーバケットアルゴリズムについて説明します。

次に、RESTにおけるアクセス制限の仕組みと、GraphQLにおけるアクセス制限の仕組みを紹介します。

最後に、RESTとGraphQLのアクセス制限を比較します。

リーキーバケットアルゴリズム(Leaky bucket algorithm)

全てのShopify APIはリーキーバケットアルゴリズムに基づいてアクセス制限されます。

このアルゴリズムではアクセス対象をバケツ(Bucket)に例えます。

アクセスがくるとバケツに水がたまります。

底に穴が空いていて、少しずつ水がこぼれ落ちていきます。

こぼれ落ちる水量より、アクセスによってたまる水量が多いと、いずれバケツがあふれます。

バケツが溢れると、アクセスは捨てられるか、待ち行列に並びます。

Admin APIにRESTでアクセスする場合

Admin APIにRESTでアクセスする場合は、リクエストの数に基づいた以下の制限があります。

バケツの用量(Bucket size)こぼれ落ちる量(Leak rate)
通常40リクエスト/アプリ/ストア 2リクエスト/秒
Shopify Plus80リクエスト/アプリ/ストア4リクエスト/秒

「40リクエスト/アプリ/ストア」は、特定のストアにインストールされた特定のアプリが持っている容量が40リクエストだということです。

1秒間に2リクエスト分回復します。

1秒間に3リクエストを送信し続けると、(2リクエストはこぼれ落ちるため、)1秒に1リクエストずつバケツにたまっていきます。

最終的にはバケツの容量である40リクエストを超えてしまい、エラーが返されます。

Shopify Plusの場合は、バケツの容量(Bucket size)とこぼれ落ちる量(Leak rate)それぞれ通常アカウントの2倍となります。

レスポンスヘッダーのX-Shopify-Shop-Api-Call-Limitの値から、現在の残されている容量がわかります。

X-Shopify-Shop-Api-Call-Limit: 32/40

Admin APIにGraphQLでアクセスする場合

GraphQLは、リクエストによって、必要な計算量や返されるデータ量が大きく変わります。

そのため、リクエストより小さな粒度でアクセス制限を管理します。

Admin APIにGraphQLでアクセスする場合は、コスト(cost)という概念に基づいて制限されます。

コストの単位はポイント(point)です。

例えば、商品を2つ要求します。

query {
 	products(first: 2) {
    edges {
      node {
        title
      }
    }
  } 
}

この場合のコスト(actualQueryCost)は4ポイントとなっています。

{
  "data": {
    "products": {
      "edges": [
        {
          "node": {
            "title": "Tシャツ"
          }
        },
        {
          "node": {
            "title": "サンプル商品2"
          }
        }
      ]
    }
  },
  "extensions": {
    "cost": {
      "requestedQueryCost": 4,
      "actualQueryCost": 4,
      "throttleStatus": {
        "maximumAvailable": 1000,
        "currentlyAvailable": 996,
        "restoreRate": 50
      }
    }
  }
}

Admin APIにGraphQLでアクセスする場合の制限は以下のようになっています。

バケツの容量(Bucket size)1000ポイント/アプリ/ストア
こぼれ落ちる量(Leak rate)50ポイント/秒

1000ポイントを超えるリクエストはエラーとなります。

1秒間に1回、100ポイントのリクエストを送ると、1秒に50ポイントずつバケツに水がたまっていき、最終的にはあふれてエラーとなります。

先ほどのクエリー結果から見て取れるように、レスポンスに含まれるcurrentlyAvailableの値から現在の容量を知ることができます。

比較

直感的には分かりにくいかもしれませんが、GraphQLの方がアクセス制限に引っかかりにくい仕組みになっています。

RESTは、クライアントにとって要らないデータも返ってきますし、複数のリクエストをほぼ同時に送信することも多いです。

一方のGraphQLは、クライアントがほしいデータのみを指定し、単一のリクエストで取得できるので、最小限の計算コストで済みます。

そのため、GraphQLを利用するとアクセス制限に引っかかりにくくなります。

多くの、多様なデータを1度に取得できれば、 開発者にとっての体験も良くなるでしょう。

GraphQLにできてRESTにできないこと

Shopify APIにはGraphQLにできてRESTにできないことがいくつか存在します。

その代表的なものを5つ紹介します。

Bulk operations(一括操作)

ShopifyのGraphQL APIにはBulk operationsという機能があります。

Bulk operationsは大量のデータを取得する非同期の操作です。

Bulk operationsはbulkOperationsRunQuery mutationで生成することができます。

mutation {
  bulkOperationRunQuery(
   query: """
    {
      products {
        edges {
          node {
            id
            title
          }
        }
      }
    }
    """
  ) {
    bulkOperation {
      id
      status
    }
    userErrors {
      field
      message
    }
  }
}

生成したあとは、クライアントからbulkOperationsオブジェクトのstatusフィールドをポーリングします。

ポーリングとは
一定期間ごとに状態を確かめるためのリクエストを送ること。
{
  currentBulkOperation {
    status
    url
  }
}

statusフィールドがCOMPLETEDになっていたら、urlフィールドに含まれるURLにアクセスしてデータを取得できます。

{
  "data": {
    "currentBulkOperation": {
      "status": "COMPLETED",
      "url": "https://storage.googleapis.com/shopify-tiers-assets-prod-us-east1/aaa.jsonl&response-content-type=application%2Fjsonl"
    }
  },
  # 省略
}

Translation APIs

Translation APIsは、ストアに複数の言語を設定した場合に、翻訳を設定したり管理するのに使えます。

Translationオブジェクトのフィールドは以下の4つです。

フィールド説明
keyString翻訳対象のID
valueString翻訳後の単語や文章
localeString言語のID
outdatedBoolean古い設定かどうか

1つの単語に対してlocaleごとに複数のTranslationオブジェクトを生成することで、サイト全体を多言語対応させることができます。

商品メディアとして動画や3Dモデルを管理

Shopifyでは商品と共に商品メディアを設定し、サイトに表示させます。

Shopifyでは商品と共に商品メディアを設定し、サイトに表示させます。

商品メディアは画像が主ですが、動画や3Dモデルを設定することもできます。

商品メディアのタイプは以下の4種類です。

タイプ説明
MediaImagePNG, GIF, JPG形式の画像ファイル。
VideoMP4形式の動画ファイル。Shopifyのサーバにホスティングされる。
ExternalVideoYouTubeにホスティングされた動画。URLで指定する。
Model3dGLB形式の3Dモデルデータ。

RESTではMediaImageにのみアクセスできますが、GraphQLは全てのメディアにアクセスできます。

Admin APIをGraphQLでアクセスすることで以下の操作が可能です。

  1. 商品メディアの更新
  2. 商品に商品メディアを加える
  3. 商品メディアを取得
  4. 商品メディアを削除

既に作成された注文を編集

GraphQLからOrder editing APIにアクセスすることで、既に作成された注文を編集することができます。

注文にマーチャントからのギフトを付け足したり、注文数を調節したり、商品を注文から削除したり、あらゆる用途で使えます。

既に作成された注文を編集する場面は無いと思われるかもしれませんが、実際のショップ運営では柔軟な対応が必要になります。

Order editing APIにアクセスするアプリを開発して、柔軟な対応を自動化することもできます。

開発者プレビューで公開されているAPIへのアクセス

Shopifyの開発者プレビュー(Developer preview)では、新しい機能を事前に試すことができます。

新しい機能はGraphQLで開発されるので、当然RESTではアクセスできません。

開発ストアを作成し、開発者プレビューを有効にすることで、開発者プレビューを試すことができます。

まとめ

本記事ではShopifyにおけるGraphQL APIとREST APIの比較を行ってきました。

RESTに比べてGraphQLでは複雑に絡み合うデータを効果的に扱うことができます。

そのため、ストアが持つデータが多様であったり、量が多い場合に、GraphQL APIでないと手に負えなくなることがあります。

GraphQLはクライアントがほしいデータのみを指定し、単一のリクエストで取得できるので、最小限の計算コストで済みます。

RESTに比べてGraphQLの方が計算コストや通信コストの無駄が少ないことから、アクセス制限に引っかかりにくくなっています。

最後にShopifyでGraphQLにできてRESTにできないことも紹介しました。以下の5つです。

  • bulk operations機能の利用
  • Translations APIへのアクセス
  • 商品メディアとして動画や3Dモデルを管理する
  • 既に作成された注文を編集する
  • 開発者プレビューで公開されているAPIにアクセスする

Shopify APIを最大限に活用するために、GraphQLの利用を是非検討してみてください。

【最後に】GraphQLをマスターしよう!

イチ役では、これからShopify開発を始める方のために、GraphQL APIについてわかりやすく解説した記事を公開しています。ぜひ以下の記事も合わせてご覧ください。

Shopifyに学ぶ!GraphQL API設計5つのポイント

<Shopify GraphQL API徹底解説シリーズ>

商品を管理するための3つのオブジェクト

在庫とストアのAPI連携を可能にする3つのオブジェクト

商品の配送に関わる4つのオブジェクト

顧客(Customer)と注文(Order)

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。