错误请求:S​​hopify 分页

Bad Request: Shopify pagination

我想问一下shopify分页版本2020-01

第一次请求查询: URL: https://klevarange.myshopify.com/admin/api/2020-01/orders.json?fulfillment_status=unfulfilled&limit=250&financial_status=paid&created_at_min=2019-08-27T16:15:47-04:00

Return Header:

"<https://klevarange.myshopify.com/admin/api/2020-01/orders.json?limit=250&page_info=eyJmaW5hbmNpYWxfc3RhdHVzIjoicGFpZCIsImZ1bGZpbGxtZW50X3N0YXR1cyI6InVuZnVsZmlsbGVkIiwiY3JlYXRlZF9hdF9taW4iOiIyMDE5LTA4LTI3IDIwOjE1OjQ3IFVUQyIsImxhc3RfaWQiOjIxMDQ4NzIxNzM2NTIsImxhc3RfdmFsdWUiOiIyMDIwLTAyLTI3IDAwOjA5OjUyIiwiZGlyZWN0aW9uIjoibmV4dCJ9>; rel=\"next\""

第二次请求查询:

"https://klevarange.myshopify.com/admin/api/2020-01/orders.json?limit=250&page_info=eyJmaW5hbmNpYWxfc3RhdHVzIjoicGFpZCIsImZ1bGZpbGxtZW50X3N0YXR1cyI6InVuZnVsZmlsbGVkIiwiY3JlYXRlZF9hdF9taW4iOiIyMDE5LTA4LTI3IDIwOjE1OjQ3IFVUQyIsImxhc3RfaWQiOjIxMDQ4NzI1MzQxMDAsImxhc3RfdmFsdWUiOiIyMDIwLTAyLTI3IDAwOjEwOjA3IiwiZGlyZWN0aW9uIjoibmV4dCJ9>; rel=\"next\""

结果:错误请求

我应该在 page_info 中输入什么?我需要在 page_info 中包含 rel=\"next\"" 吗?

谢谢。

你应该只使用这部分:https://klevarange.myshopify.com/admin/api/2020-01/orders.json?limit=250&page_info=eyJmaW5hbmNpYWxfc3RhdHVzIjoicGFpZCIsImZ1bGZpbGxtZW50X3N0YXR1cyI6InVuZnVsZmlsbGVkIiwiY3JlYXRlZF9hdF9taW4iOiIyMDE5LTA4LTI3IDIwOjE1OjQ3IFVUQyIsImxhc3RfaWQiOjIxMDQ4NzI1MzQxMDAsImxhc3RfdmFsdWUiOiIyMDIwLTAyLTI3IDAwOjEwOjA3IiwiZGlyZWN0aW9uIjoibmV4dCJ9 即没有 rel="next"

在第二次及以后的所有请求中,您最多只能传递 3 个查询参数:

  • page_info
  • limit
  • fields

因此,如果您想从下一页获得结果,您需要从第一个响应 headers.

中提取 page_info

这个想法是,您在请求结果时只能向前或向后移动,并且只有在检索到当前页面结果。

从您的 page_info 变量

中删除 >
var page_info = "eyJmaW5hbmNpYWxfc3RhdHVzIjoicGFpZCIsImZ1bGZpbGxtZW50X3N0YXR1cyI6InVuZnVsZmlsbGVkIiwiY3JlYXRlZF9hdF9taW4iOiIyMDE5LTA4LTI3IDIwOjE1OjQ3IFVUQyIsImxhc3RfaWQiOjIxMDQ4NzI1MzQxMDAsImxhc3RfdmFsdWUiOiIyMDIwLTAyLTI3IDAwOjEwOjA3IiwiZGlyZWN0aW9uIjoibmV4dCJ9"

并提出您的请求 URL,如下所示。

https://klevarange.myshopify.com/admin/api/2020-01/orders.json?limit=250&page_info={page_info}

深入挖掘

你需要迭代你的while循环,直到响应头中没有Link参数并且这个参数不是静态值它是最后一个地址object you get and saying next 会给你接下来的 250 个对象。

您需要使用新生成的下一个引用 ( pageInfo ) 在每个请求中更新您的 pageInfo 参数

当你没有得到这个参数时,意味着没有下一页或上一页。

看看下面的代码...(用 php 编写)

How to create pagination in shopify rest api using php

可能最近2年,Shopify对他们的API做了一些修改,然后我用GetNextPageFilter的方法。这是我的方法。

public async Task<IEnumerable<Product>> ProductsGetList(string shopUrl, string accessToken)
    {
        var products = new List<Product>();
        var service = new ProductService(shopUrl, accessToken);

        var filter = GetFilters(shopUrl);
        var productList = await service.ListAsync(filter);

        if (productList != null && productList.Items.Any())
        {
            products.AddRange(productList.Items);
            bool hasMorePages = productList.HasNextPage;
            if (hasMorePages)
            {
                do
                {
                    var filterList = productList.GetNextPageFilter(filter.Limit, filter.Fields);
                    productList = await service.ListAsync(filterList);

                    if (productList != null && productList.Items.Any())
                    {
                        products.AddRange(productList.Items);
                        hasMorePages = productList.HasNextPage;
                    }
                } while (hasMorePages);
            }

        }


        return products;
    }

private ProductListFilter GetFilters(string url)
    {
        ProductListFilter filters = new ProductListFilter();

        string queryString = new System.Uri(url).Query;
        var queryDictionary = System.Web.HttpUtility.ParseQueryString(queryString);

        foreach (var parameter in queryDictionary)
        {
            var key = (string)parameter;
            var value = queryDictionary.Get(key);
            switch (key)
            {
                case "published_status":
                    filters.PublishedStatus = value;
                    break;
                case "published_at_max":
                    filters.PublishedAtMax = DateTimeOffset.Parse(value); 
                    break;
                case "published_at_min":
                    filters.PublishedAtMin = DateTimeOffset.Parse(value);
                    break;
                case "updated_at_max":
                    filters.UpdatedAtMax = DateTimeOffset.Parse(value);
                    break;
                case "updated_at_min":
                    filters.UpdatedAtMin = DateTimeOffset.Parse(value);
                    break;
                case "created_at_max":
                    filters.CreatedAtMax = DateTimeOffset.Parse(value);
                    break;
                case "presentment_currencies":
                    filters.PresentmentCurrencies = value.Split(',').AsEnumerable();
                    break;
                case "created_at_min":
                    filters.CreatedAtMin = DateTimeOffset.Parse(value);
                    break;
                case "status":
                    filters.Status = value;
                    break;
                case "product_type":
                    filters.ProductType = value;
                    break;
                case "handle":
                    filters.Handle = value; 
                    break;
                case "vendor":
                    filters.Vendor = value;
                    break;
                case "title":
                    filters.Title = value;
                    break;
                case "since_id":
                    filters.SinceId = long.Parse(value);
                    break;
                case "collection_id":
                    filters.CollectionId = long.Parse(value);
                    break;
                case "ids":
                    filters.Ids = value.Split(',').AsEnumerable().Cast<long>();
                    break;
                case "limit":
                    filters.Limit = int.Parse(value);
                    break;
            }
        }

        return filters;
    }

其中 shopUrl 是整个 URL (https://{apiKey}:{password}@{hostname}/admin/api/{version}/{resource}。json) 和 accessToken 是 URL {密码} 属性