获取所有 Shopify 产品
Get ALL Shopify Products
我正在尝试从 Shopify 商店获取所有产品的 JSON。我一直在向
发出 GET 请求
{STORE URL}/products.json
端点。但这最终只显示了商店提供的部分产品(很多,但不是全部)。当我将参数更改为:
{STORE URL}/products.json?limit=20000000
我得到了更多的产品,但还不是全部。我怀疑网站销售的产品超过 2000 万种。我也在使用 Axios 顺便说一句。如果您知道为什么会发生这种情况以及如何获得产品、变体等的完整列表,请告诉我。
您不能通过 Shopify 的单个请求获得超过 250 种产品。
参考这里的文档:https://shopify.dev/docs/admin-api/rest/reference/products/product?api[version]=2020-04(其中限制最大值可以是 250)
为了获得超过 250 种产品,您需要使用递归函数并使用 page_info
参数进行分页请求。有关此事的更多信息,请参见此处:https://shopify.dev/tutorials/make-paginated-requests-to-rest-admin-api
当你提出请求时,有一个分页 shopify returns 一个 header 类似于这个:
Link: "<https://{shop}.myshopify.com/admin/api/2019-07/products.json?page_info=vwxyzab&limit=6>; rel=next"
为了向第二个页面发出请求,您需要获取 link 并向其发出请求,当您发出该请求时同样适用,将有相同的 header 如果还有更多页面等等。
因此您需要从中获取您的响应 header 和 link 并使其递归:
function makeRequest(nextLink = '{STORE URL}/products.json?limit=250'){
return new Promise((resolve, reject) => {
fetch(nextLink).then(r => {
const headerLink = r.headers.get('link');
const match = headerLink.match(/<[^;]+\/(\w+\.json[^;]+)>;\srel="next"/);
const nextLink = match ? match[1] : false;
if(nextLink){
makeRequest(nextLink)
} else {
resolve();
}
})
})
}
我正在尝试从 Shopify 商店获取所有产品的 JSON。我一直在向
发出 GET 请求{STORE URL}/products.json
端点。但这最终只显示了商店提供的部分产品(很多,但不是全部)。当我将参数更改为:
{STORE URL}/products.json?limit=20000000
我得到了更多的产品,但还不是全部。我怀疑网站销售的产品超过 2000 万种。我也在使用 Axios 顺便说一句。如果您知道为什么会发生这种情况以及如何获得产品、变体等的完整列表,请告诉我。
您不能通过 Shopify 的单个请求获得超过 250 种产品。
参考这里的文档:https://shopify.dev/docs/admin-api/rest/reference/products/product?api[version]=2020-04(其中限制最大值可以是 250)
为了获得超过 250 种产品,您需要使用递归函数并使用 page_info
参数进行分页请求。有关此事的更多信息,请参见此处:https://shopify.dev/tutorials/make-paginated-requests-to-rest-admin-api
当你提出请求时,有一个分页 shopify returns 一个 header 类似于这个:
Link: "<https://{shop}.myshopify.com/admin/api/2019-07/products.json?page_info=vwxyzab&limit=6>; rel=next"
为了向第二个页面发出请求,您需要获取 link 并向其发出请求,当您发出该请求时同样适用,将有相同的 header 如果还有更多页面等等。
因此您需要从中获取您的响应 header 和 link 并使其递归:
function makeRequest(nextLink = '{STORE URL}/products.json?limit=250'){
return new Promise((resolve, reject) => {
fetch(nextLink).then(r => {
const headerLink = r.headers.get('link');
const match = headerLink.match(/<[^;]+\/(\w+\.json[^;]+)>;\srel="next"/);
const nextLink = match ? match[1] : false;
if(nextLink){
makeRequest(nextLink)
} else {
resolve();
}
})
})
}