json - 获取所有 Shopify 产品

标签 json http axios shopify

我正在尝试从 Shopify 商店获取所有产品的 JSON。我一直在向
{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 会返回与此类似的 header :

Link: "<https://{shop}.myshopify.com/admin/api/2019-07/products.json?page_info=vwxyzab&limit=6>; rel=next"

为了向第二个页面发出请求,您需要获取链接并向其发出请求,这同样适用于您发出该请求时,如果有更多页面,则会有相同的 header 等等。

因此,您需要从中获取响应 header 和链接并使其递归:
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();
      }
    })
  })
}

关于json - 获取所有 Shopify 产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62272801/

相关文章:

java - 如何反序列化来自 RESTful Web 服务的 JSON 响应?

http - 双引号中的 Cookie 值

c - C语言向服务器发送HTTP请求后什么也没有收到

reactjs - 在react js中调用axios get请求时出现网络错误

javascript - Vue.js 应用程序中的预加载器?

javascript - 将 python 列表转换为 javascript 数组

json - Cloudformation 与 OpsWorks 处理空值

json - 使用 Newtonsoft JSON 反序列化的 System.TypeLoadException

ruby - 如何在 Ruby 中正确关闭 HTTP 连接

javascript - axios没有返回与参数对象的查询字符串匹配的数据,而是返回vanila JS中的所有数据