Shopify の GraphQL Admin API から Product 一覧を取得する

2024/09/04に公開

Shopify が提供しているAdmiin APIを使用することで、Shopifyに登録している商品一覧を取得できます。
Shopify には GraphQL と REST API の2つの管理系 API が用意されていますが、REST Admin API の 2024-04 リリース版から Product API がメンテナンスモードとなりました。そのため、これから新規で Product 関連の機能開発をするのであれば、GraphQLを使うのが良さそうです。
Go で Shopify の GraphQL Admin API を叩いてみた系の記事がなかったので、サンプルコードを共有します。

使用するライブラリ

Go の Shopify 公式ライブラリはありませんが、公式ドキュメントに紹介されている go-shopify を使用します。

Go で GraphQL Admin API から Product 一覧を取得するサンプルコード

以下のコードは、ShopifyのGraphQL APIから商品一覧を取得するサンプルです。

type Category struct {
	FullName string `json:"fullName"`
}

type FeatureImage struct {
	URL string `json:"url"`
}

// https://shopify.dev/docs/api/admin-graphql/2024-07/objects/Product
type Product struct {
	ID           string       `json:"id"`
	Title        string       `json:"title"`
	Description  string       `json:"description"`
	Tags         []string     `json:"tags"`
	Category     Category     `json:"category,omitempty"`
	FeatureImage FeatureImage `json:"featuredImage"`
}

type Edge struct {
	Node Product `json:"node"`
}

type Products struct {
	Edges []Edge `json:"edges"`
}

type Response struct {
	Products Products `json:"products"`
}

func listItems(shopName string) {
	ctx := context.Background()

	err := setup(shopName)
	if err != nil {
		log.Fatal(fmt.Printf("Error setting up Shopify client: %s", err))
	}

	q := `{
		products (first: 10) {
			edges {
				node {
					id
					title
					description
					tags
					featuredImage {
						url
					}
					category {
						fullName
					}
				}
			}
		}
	}`

	var resp Response
	err = client.GraphQL.Query(ctx, q, nil, &resp)
	if err != nil {
		log.Fatal(fmt.Printf("Error querying Shopify: %v", err))
	}
	fmt.Printf("Items: %+v\n", resp.Products.Edges)
}

func setup(shopName string) error {
	var err error
	app = goshopify.App{
		ApiKey:      os.Getenv("SHOPIFY_API_KEY"),
		ApiSecret:   os.Getenv("SHOPIFY_API_SECRET"),
		RedirectUrl: os.Getenv("SHOPIFY_REDIRECT_URL"),
		Scope:       "read_products",
	}

	client, err = goshopify.NewClient(app, shopName, os.Getenv("SHOPIFY_ACCESS_TOKEN"), goshopify.WithVersion("2024-07"))
	if err != nil {
		return err
	}
	return nil
}

以下のようにデータを取得できました。

Items: [{Node:{ID:gid://shopify/Product/xxxxxxx Title:サンプル商品1 Description:この商品はサンプル商品です。 APIテストのためのサンプルです。 Tags:[] Category:{FullName:Software > Computer Software > Business & Productivity Software > Project Management Software} FeatureImage:{URL:https://cdn.shopify.com/s/files/yyyyyyy}}}]

GraphQL で取得したデータを構造体にマッピングするため、自分で構造体を定義していますが、ここはもっとスマートな方法があるかもしれません。

はまりポイント

使用するAPIバージョンを明示しないと、Not Acceptable エラーが発生します。
クライアント作成時に、goshopify.WithVersion("2024-07") のように、バージョンを指定します。

GitHubで編集を提案

Discussion