如何在应用程序中使用相对分页

相对分页

从Shopify加载特定型号的所有记录是应用程序执行的最耗时的操作之一,无论这些记录是订单、产品、变体还是其他内容。对于拥有数百万条记录的大型商店来说尤其如此。

为了解决这个问题,我们取消了页面参数,并添加了对基于指针的相对分页中的某些选择端点的Via链接头2019-07 REST Admin API版本.在本文中,我们将看看这个变化对Shopify应用程序开发人员意味着什么,解释如何在应用程序中使用两种不同形式的相对游标分页,并详细介绍如何使用新的批量操作API获取所有记录。

为Shopify商家开发应用程序

无论您是想为Shopify应用商店开发应用程序,提供私人应用程序开发服务,还是正在寻找扩大用户基础的方法,Shopify合作伙伴计划都将为您的成功奠定基础。免费加入并获得教育资源、开发人员预览环境和经常性收入分享机会。

报名

相对游标与页面参数

在深入研究相对分页之前,让我们看看之前的情况。从Shopify加载商店记录的经典方法是使用页面参数,其中从第1页开始,每个后续请OB欧宝娱乐APP求都有一个页面参数1比前一个高。这种方法的问题在于页面数值,则查询中的偏移量越大。偏移量越大,请求就越慢,直到超时为止。

有一种替代方法可以提供更好的性能,无论您走多远的记录:相对游标。这基本上意味着记住上一页的结束点和下一页的开始点。把它想象成使用书签:你可以直接跳转到正确的位置,而不是在书中翻页寻找你上次停止阅读的地方。关于两者之间的实现和性能差异的更多信息,请参见Shopify工程博客

引入相对基于光标的分页Shopify

2019-07 API版本,我们删除了页面参数和增加了对基于相对指针的分页的支持通过链接头选择端点。中的其余端点将进行更新2019-10 REST Admin API版本.支持的旧API版本页面从取代它们的版本发布之日起将继续工作9个月。2019-07版中更新的端点将继续使用页面在2020年4月之前使用旧API版本,在2019-10版本中更新的API版本将继续使用页面在2020年7月之前使用旧API版本。

你可能还会喜欢:在Shopify中引入API版本控制

相对分页的类型

在Shopify内部,我们支持两种类型的相对分页since_id的url链接头。在下面的部分中,我们将给出如何使用每种方法的示例,并解释两者之间的权衡。

分页,since_id

这是相对游标分页的最简单形式。每个请求将包括一个since_id参数,使用上一页的最后一条记录的id。这确实要求记录按id升序排序,但是当asince_id参数存在。要确保第一页是按id排序的,可以包含since_id参数,值为0。在2019-07 API版本之前,这种形式的分页已经存在于所有端点上。

例如,如果你从你的商店请求产品的页面,对第一页的请求可能像下面这样:

https://shop-domain.myshopify.com/admin/products.json?limit=5&fields=id,title&since_id=0

这将返回以下响应:

取最后一条记录的id,获取下一页的请求将是:

https://shop-domain.myshopify.com/admin/products.json?limit=5&fields=id,title&since_id=45678

使用一个since_id是最快的解决方案,当顺序不重要时,它应该是分页的首选。

使用链接标头进行分页

当顺序很重要的时候呢?也许您希望装载库存最多的前1000个产品,但由于上限为250个,这意味着至少发出4个请求。你也不会想用since_id,因为你需要取回所有然后再确定库存最高的1000种产品。根据商店的大小,这可能意味着从Shopify加载更多的唱片。此外,库存总量不会作为产品上的单个字段公开,因此这也意味着将各个变量的库存数量相加并对其进行排序。

有一个更简单的方法:使用链接头。在较新的API版本中页面参数被删除时,具有多个页面的每个请求都将包含一个名为链接.这个头包含上一页和下一页的url,如果它们存在,尊重所要求的排序顺序。加载下一页所需的所有数据都嵌入在page_info参数。

但是,这也有一个缺点:我们的测试表明,使用链接头中的url比使用慢10%到30%since_id.但是,它们都比使用页面参数,特别是当有数千条或更多记录时。

使用上面的例子,装载按总库存数量递减排序的产品,第一个请求看起来像这样:

https://shop-domain.myshopify.com/admin/api/2019-07/products.json?order=inventory_total+desc&limit=250

响应将包含链接如果有更多的页面,标题将看起来像这样:

< https://shop-domain.myshopify.io/admin/api/2019-07/products.json?limit=250&page_info=eyJsYXN0X2lkIjoxOTg1ODQxNzk0LCJsYXN0X3ZhbHVlIjoiQWNxdWlyZWQgQ2FudmFzIFBlbiIsImRpcmVjdGlvbiI6Im5leHQifQ%3D%3D >;rel =“下一个”

下一页的URL看起来是这样的:

https://shop-domain.myshopify.io/admin/api/2019-07/products.json?limit=250&page_info=eyJsYXN0X2lkIjoxOTg1ODQxNzk0LCJsYXN0X3ZhbHVlIjoiQWNxdWlyZWQgQ2FudmFzIFBlbiIsImRpcmVjdGlvbiI6Im5leHQifQ%3D%3D

这个URL可以从头中解析出来,在跟随它之后,后续的请求将在响应中有另一个头,看起来像下面这样:

< https://shop-domain.myshopify.com/admin/api/2019-07/products.json?limit=50&page_info=eyJkaXJlY3Rpb24iOiJwcmV2IiwibGFzdF9pZCI6MTk4NTgyMTYzNCwibGFzdF92YWx1ZSI6IkFjcm9saXRoaWMgQWx1bWludW0gUGVuY2lsIn0%3D >;rel = "以前",< https://shop-domain.myshopify.com/admin/api/2019-07/products.json?limit=50&page_info=eyJkaXJlY3Rpb24iOiJuZXh0IiwibGFzdF9pZCI6MTk4NTgzNjU0NiwibGFzdF92YWx1ZSI6IkFoaXN0b3JpY2FsIFZpbnlsIEtleWJvYXJkIn0%3D >;rel = "下一个

因为这个请求不是针对第一页的,所以这次在头文件中有一个下一页URL和一个上一页URL。可以重复解析出下一页URL并遵循它,直到检索到所需数量的记录,或者直到标头中没有下一页URL,此时已检索到所有匹配的记录。

注意,在第一个请求之后限制parameter是URL中唯一的参数page_info.这是因为修改是安全的限制在请求之间。一些参数,如排序顺序和过滤器,在更改时会中断请求,这些参数直接嵌入到page_info.试图从链接头添加或修改url上的过滤器或排序参数将导致请求失败。如果需要不同的排序顺序或筛选,则必须在第一页上重新启动。OB欧宝娱乐APP同样重要的是要注意链接头url是临时的,不应该保存以供以后使用。

你可能还会喜欢:Shopify GraphQL学习工具包

迁移应用程序以使用相对分页

根据我们的API发布计划,2019-04 API版本的支持将于2020年4月取消,这是支持的最后一个版本页面在2019-07版本更新的这些端点上的参数。同样,2019-07 API版本的支持将于2020年7月取消,届时将没有终端支持页面参数。重要的是在此之前将所有应用程序迁移到使用相对分页,否则它们将在第一页之后停止工作。

为了便于更新,使用Shopify API精华现在支持相对分页。使用它来获得前1000个产品按库存总量递减排序是相当简单的:

对于不是用Ruby编写的应用程序,添加对Shopify API gem的支持的更改可以用作蓝图。它是可用的GitHub上

这种转变有一个很大的好处:速度!相对分页的两种方法都比使用页面参数,特别是在大页码时。在我们在一个大型测试车间的实验中,使用相对游标加载第100,000个产品要比使用相对游标快数百倍页面参数。

一种常用的情况页面现在是同时对一系列页码进行并发请求。使用相对游标,这将不再可能,因为它需要获取一个页面才能知道下一页从哪里开始。OB欧宝娱乐APP相对基于游标的分页对于获取大型商店上的所有记录来说更快,这种速度的提高将弥补这些商店上并发请求的不足。

在Admin GraphQL API中使用批量操作

Shopify Unite 2019,我们介绍批量操作GraphQL,它允许应用程序以一种全新的方式获取大量数据。应用程序不再对连续的记录页发出一系列请求,而是发出一个单独的请求来启动一个异步运行的操作。该应用程序会定期轮询操作的状态,一旦操作完成,就会获得一个下载包含全套结果的文件的链接。

大容量操作在内部使用相对游标,因此与使用基于相对游标的分页具有相同的性能优势。使用实例替换并发请求是一个很好的选择页面参数。

从2019-10年起,我们的Admin GraphQL API现在可以使用批量操作。关于如何使用它们的例子可以找到在文档中

为Shopify商家开发应用程序

无论您是想为Shopify应用商店开发应用程序,提供私人应用程序开发服务,还是正在寻找扩大用户基础的方法,Shopify合作伙伴计划都将为您的成功奠定基础。免费加入并获得教育资源、开发人员预览环境和经常性收入分享机会。

报名

迁移你的应用以获得更好的功能

所有的应用程序最终都将不得不放弃使用分页页面参数,但是在使用相对游标的速度增加和使用批量操作API的简单性之间,这些变化将帮助你的应用程序有一个更快的整体性能,特别是在处理大量数据的商店时。如果您对分页或新的大容量操作API有疑问,请前往到我们的论坛

你错过Shopify Unite的公告了吗?看看我们的新api在YouTube上观看田径比赛

通过Shopify合作伙伴计划发展您的业务

了解更多