MORE

BLOG

Shopify REST APIの廃止とGraphQLへの移行メリットと注意点

  • GraphQL
  • REST API
  • Shopify
  • Shopifyアプリ
  • Tips
  • 注意点
  • 移行
  • 開発
25.02.26

1. はじめに

1.1 記事について

ShopifyがREST APIの廃止を進める中、GraphQLへの移行が求められています。直近では、2025年4月1日までに商品のエンドポイント(/products、/variants)はサポート外となります。(公開アプリの場合は2025年2月1日までのmigrateが必要)

参考:

・Public apps must migrate by February 2025

・Custom apps must migrate by April 2025

https://shopify.dev/docs/apps/build/graphql/migrate/new-product-model

本記事では、REST APIと比較した時のGraphQLのメリットや移行する際の注意点を解説したいと思います。

※2025年2月時点では廃止にはなっておらず、非推奨なのでお間違いないようご注意ください。

1.2 記事の対象

・Shopify APIを活用しているEC運営者

・Shopifyのカスタム開発を行うエンジニア

・REST API廃止に伴う対応を考えている方

※記事に登場する技術用語の説明は省くので、多少の用語知識は必要となります。

1.3 記事を読み終えるまでの時間

約15分程度

2. Shopify GraphQLとREST APIについて

2.1 GraphQLとREST APIの違い

この議題を掘ると長くなるので、Amazon公式にで説明しているリンクを貼ります。

https://aws.amazon.com/jp/compare/the-difference-between-graphql-and-rest/

設計思想や使い方など、全くの別物です。ちなみにGraphQLの方が後発です。

2.2 ShopifyにおけるGraphQLのメリット

Shopifyに限らない点もありますが、以下のようなメリットがあります。

1. 必要なデータのみを取得可能

2. API rate limitsをcostでコントロールできる

3. 大量データの取得

3. GraphQL移行のメリット

具体的にREST APIと比較した時のGraphQLのメリットについて記載したいと思います。

3.1 必要なデータのみを取得可能

これが最も大きなメリットと言っても過言ではないかもしれません。まず、REST APIですと、クライアント側でのデータの使用有無に関わらず全てのデータが応答されるため、オーバーフェッチ(不要なデータまで取得してしまうこと)となり、処理の複雑化や低下を招く可能性があります。例えば、顧客の姓名だけ取得したいのに、電話番号、メールアドレス、住所なども一律すべて応答されてしまうようなイメージです。

それに比べ、GraphQLであれば顧客の名前だけ頂戴とリクエストしてあげれば、名前だけ返してもらえるので、とてもシンプルです。

以下のようにid, firstName, lastNameだけ頂戴とリクエストすれば、

{
customer(id: "gid://shopify/Customer/XXXXXXXXXX") {
id
firstName
lastName
}
}

欲しいデータだけ応答されます。(dataの部分)

{
  "data": {
    "customer": {
      "id": "gid://shopify/Customer/XXXXXXXXXX",
      "firstName": "hoge",
      "lastName": "fuga"
    }
  },
  "extensions": {
    "cost": {
      "requestedQueryCost": 1,
      "actualQueryCost": 1,
      "throttleStatus": {
        "maximumAvailable": 2000,
        "currentlyAvailable": 1959,
        "restoreRate": 100
      }
    }
  }
}

※上記の例にもありますが、レスポンスデータにはcost情報も応答されるため検証時に負荷の考慮や計算もしやすいです。costに関しては後述します。

参考:

https://shopify.dev/docs/api/admin-graphql/2025-01/queries/customer

ちなみにREST APIの場合は、以下のようにリクエストすると、

GET /admin/api/2025-01/customers/207119551.json

名前以外の使用しないデータも全て応答される仕様となります。

{
  "customer": {
    "id": 207119551,
    "email": "bob.norman@mail.example.com",
    "created_at": "2025-01-02T11:25:58-05:00",
    "updated_at": "2025-01-02T11:25:58-05:00",
    "first_name": "Bob",
    "last_name": "Norman",
    "orders_count": 1,
    "state": "disabled",
    "total_spent": "199.65",
    "last_order_id": 450789469,
    "note": null,
    "verified_email": true,
    "multipass_identifier": null,
    "tax_exempt": false,
    "tags": "Léon, Noël",
    "last_order_name": "#1001",
    "currency": "USD",
    "phone": "+16136120707",
    "addresses": [
      {
        "id": 207119551,
        "customer_id": 207119551,
        "first_name": null,
        "last_name": null,
        "company": null,
        "address1": "Chestnut Street 92",
        "address2": "",
        "city": "Louisville",
        "province": "Kentucky",
        "country": "United States",
        "zip": "40202",
        "phone": "555-625-1199",
        "name": "",
        "province_code": "KY",
        "country_code": "US",
        "country_name": "United States",
        "default": true
      }
    ],
    "tax_exemptions": [],
    "email_marketing_consent": {
      "state": "not_subscribed",
      "opt_in_level": null,
      "consent_updated_at": "2004-06-13T11:57:11-04:00"
    },
    "sms_marketing_consent": {
      "state": "not_subscribed",
      "opt_in_level": "single_opt_in",
      "consent_updated_at": "2024-01-01T07:00:00-05:00",
      "consent_collected_from": "OTHER"
    },
    "admin_graphql_api_id": "gid://shopify/Customer/207119551",
    "default_address": {
      "id": 207119551,
      "customer_id": 207119551,
      "first_name": null,
      "last_name": null,
      "company": null,
      "address1": "Chestnut Street 92",
      "address2": "",
      "city": "Louisville",
      "province": "Kentucky",
      "country": "United States",
      "zip": "40202",
      "phone": "555-625-1199",
      "name": "",
      "province_code": "KY",
      "country_code": "US",
      "country_name": "United States",
      "default": true
    }
  }
}

参考

https://shopify.dev/docs/api/admin-rest/2025-01/resources/customer#get-customers-customer-id

3.2 API rate limitsをcostでコントロールできる

RESTにもGraphQLにもAPIリクエストの上限があります。(上限を設けないと青天井で負荷が上がってしまうため)

Shopifyの仕様上、REST APIは1秒間に2回(上限はShopifyプランによって異なります)までリクエスト可能ですが、GraphQLの場合はリクエストするクエリのcostによって柔軟にコントロールが可能になります。前述の顧客の姓名だけの取得であれば、とても小さいcostなので、GraphQLであれば1秒間に何十回とリクエスト可能です。それに比べ、REST APIでは姓名だけ取得するにも1秒間で2回までのリクエスト制限となります。1秒間に3回以上のリクエストが送信されると、待ち行列となります。待ち行列となったリクエストはBucket sizeと呼ばれる上限数まで待機可能となります。Bucket sizeの上限は40なので、40以上のリクエストが溜まってしまうと、429 Too Many Requestsのエラーが応答されます。

参考:

Shopify API rate limits

https://shopify.dev/docs/api/usage/rate-limits

REST Admin API rate limits ※REST APIは非推奨のため別ページになっているようです。

・Standard limit: 2 requests/second

・Advanced Shopify limit: 4 requests/second

・Shopify Plus limit: 20 requests/second

・Shopify for enterprise (Commerce Components): 40 requests/ second

https://shopify.dev/docs/api/admin-rest/usage/rate-limits

・Bucket size: 40 requests/app/store

・Leak rate: 2/second

Shopify Plus

・Bucket size: 400 requests/app/store

・Leak rate: 20/second

3.3 大量データの取得

ShopifyのREST APIでは、1度に取得可能なデータ上限は最大で250個です。そのため、取得するデータによっては複数回のAPIリクエストが生じます。通信回数が多くなればなるほど、オーバーヘッドを起こしやすくなり、通信速度の低下にも繋がります。

一方、GraphQLでも上限はREST同様のためページング処理は必要ですが、1.のメリットで述べたように必要最低限のデータだけに絞ってリクエストすればトラフィックを抑えることが可能です。ただし、あまりにも大量のデータの場合、costの懸念があるため、本当に大量のデータを一括取得したい場合は、Bulk Operationsという手法を用います。Bulk Operationsは非同期処理となりますが、一括取得が可能となります。

参考:

・The default limit value is 50.

・The maximum limit value is 250.

https://shopify.dev/docs/api/admin-rest/usage/pagination

Bulk Operations

https://shopify.dev/docs/api/usage/bulk-operations/queries

その他にも、以下のようなメリットもあります。

・単一エンドポイントを使える。

・複数リソースを一度に取得できる。(1回のリクエストで複数リソースのクエリを定義できる)

・スキーマで型を定義できるのでデータ構造が明確化する。 →エラーを早期発見できる。

4. 移行時の注意点

4.1 インターフェースの改修

当然ですが、REST APIからGraphQLに変更になるため、Shopifyへデータの取得や更新を行うインターフェースの変更が必要となります。実装例にも記載したようにリクエスト方法やレスポンスデータが全く異なるので、インターフェース部分は丸っと書き換えが必要となり、当然それに伴うテストも必要となります。

既存のシステムが、インターフェース部分とデータ取得後のビジネスロジック部分をなるべく依存せずに設計されていれば、改修箇所は限られた範囲に収められるかもしれません。ただ、元々の設計で切り離して考えられていないと改修コストは大きくなる可能性があります。

まずは、今の実装がどうなっているか調査確認し、影響範囲・改修範囲を特定する必要があります。

4.2 cost管理

メリットのところで紹介しましたが、APIのrate limitsの考え方が大きく異なります。

REST APIでは1秒間にリクエスト可能な上限数が存在しており、リクエスト内容に関わらず上限が適用されます。

しかし、GraphQLではcostという概念でAPIのlimitsが決まっています。1秒間に消費可能なcost上限が存在していて、costを消費すると回復するまで待機することとなります。

このcostはリクエストするクエリによって異なるため、実際にリクエストしてみて確認してみると良いでしょう。

Shopify GraphiQL Appというものが存在しており、ストアにインストールするだけで簡単にGraphQLを用いたリクエストを管理画面から投げられます。実際のレスポンス内容の確認やcostの確認にも便利なアプリなので、Shopifyで大規模な開発を行う場合はインストールしておくことをオススメいたします。

https://shopify.dev/docs/api/usage/api-exploration/admin-graphiql-explorer

4.3 GraphQLで出来ないこと

以前は、pagesやblogsなどオンラインストアに関わるデータ関連は、RESTでしかアクセスできませんでした。しかし、2024-10のバージョンからGraphQLでもアクセス可能となっています。

細かいところまで全ては見れていませんが、まだREST APIでのみしかアクセスできないデータも存在しているかもしれません。

また、Customerに関しては、パスワードの更新がGraphQLだと2025年2月現在では出来ないため、REST APIを利用して新規会員登録や会員情報更新の機能やアプリを実装している場合、今後のGraphQLのアップデートが待たれます。もしくは会員登録/更新のフローを再設計してからGraphQLへ移行する必要が出てきます。(パスワード更新が不可のため、UI/UXの大幅な変更が必要となります)

まとめ

今回、ShopifyのREST APIの廃止について、GraphQLへ移行するメリットや移行時の注意点を記載してきました。開発者視点としては、GraphQLの方が柔軟性があって実装しやすいためウェルカムではあります。ただ、今後、REST APIを利用しているアプリや機能は、GraphQLへの移行が必須になりますので、なるべく早い移行計画をオススメいたします!

最後に述べたようにGraphQLで提供されていないものもまだ存在はしているため、どのように移行してくのか、本記事を参考に検討してみて下さい。

著者:PM戦士@一杯ならノンアルのうち

弊社では、ECサイトのリプレース案件から、Shopifyカスタムアプリ開発、保守案件に至るまで、EC中心にプロジェクトの質にこだわり、お客様に笑顔になってもらえるよう日々邁進しております。

皆様からのお問い合わせ・ご相談をお待ちしております。

お問い合わせはこちら