2018年5月,我们宣布Shopify的管理APIGraphQL,作为一个现代的、功能强大的、更容易使用的API供您构建。使用GraphQL是一种令人兴奋的与api交互的方式,并为应用程序开发人员打开了一个全新的可能性世界。
无论您是希望有效地检索关于几个不同的相关对象的信息,还是仅仅获得一个字段的信息而不消耗REST调用限制的重要部分,现在都是快速了解如何使用我们的方法的最佳时机GraphQL管理API.
为了帮助您充分利用GraphQL中Admin API提供的所有可能性,我们整理了这个学习工具包。它将指导您通过各种调用Shopify GraphQL管理API,使用失眠API客户端.
为Shopify商家开发应用程序
无论您是想为Shopify应用商店开发应用程序,提供私人应用程序开发服务,还是正在寻找扩大用户基础的方法,Shopify合作伙伴计划都将为您的成功奠定基础。免费加入并获得教育资源、开发人员预览环境和经常性收入分享机会。
报名1.先决条件
为了跟随本演练,您需要一些东西:
- 你自己的你在商店中创建的私有应用程序
- 它将需要读取和写入权限:
- 产品
- 客户
- 订单
- DraftOrders
- 点击“审查禁用的管理API权限”,向下滚动到底部,找到最后一个权限
- 的失眠API客户端
- 的Shopify GraphQL攻略失眠收集
如何配置失眠
安装了Insomnia之后,需要导入集合,并确保它已正确配置,以便使用API凭证调用您的存储。下面是执行此操作的步骤。
步骤1:导入集合
一旦你作为集合下载了演练,您需要将其导入到Insomnia。
打开导入/导出失眠的窗口:
从数据选项卡,浏览到集合:
切换到Shopify GraphQL工作区:
步骤2:配置环境变量
环境变量是JSON键值对,允许您引用值,而不必每次都将它们写出来。
在我们的设置中,我们将定义两个环境变量:
- 的
商店
我们将会接触到 - 如果你的商店是mydevstore.myshopify.com,在这里输入“mydevstore”
- 的
access_token
我们会用到 - 这是你的私人应用程序的密码,在该应用程序的页面上可见
这将使您能够在不同的Shopify商店中重用此集合中的所有查询,只需更改Insomnia环境变量即可。
方法设置环境变量管理环境窗口,并将详细信息添加到my-test-store-details子:
步骤3:运行测试查询
现在是时候进行测试了。
在Insomnia中,打开第二个查询,在Shopify GraphQL攻略>失眠配置名为运行其余查询.
您应该在框架的顶部看到,我们正在使用“store”来构建端点的地址。
您也可以点击头在顶部,以查看我们与请求一起发送的头文件,包括access_token
.
将鼠标悬停在其中一个上应该会显示将被替换到请求中的值。
如果您没有看到您的值,请确保您选择了正确的环境。
在您的环境中设置了这两个字段之后,尝试运行下面的查询。你应该拿回你店的名字。
2.查询结构示例
让我们从学习OB欧宝娱乐APP如何构造查询来充分利用GraphQL开始。
QueryRoot对象
的QueryRoot表示进入GraphQL Admin API图的容易访问的入口点。
若要使用此页,请搜索该页以查找您感兴趣的资源,然后单击以了解更多信息。
在我们的示例中,我们将另看一下Shop资源,因为它是一个单独的对象。对象表示的概念商店,或单个订单,并包含字段中的数据。
在GraphQL中,我们总是需要从可用字段中选择我们想要返回的内容。另外,Insomnia会在您选择字段时自动补全有效字段,因此您可以随意修改下面的查询以获得更多或更少的信息。
该查询获取Shop对象,并指定希望返回哪些字段。
你可能会注意到,你得到了你想要的东西,然后还有更多。在返回的JSON有效负载中,您应该看到两个顶级键:“data”和“extensions”。
- “数据”总是您在查询中刚刚请求的内容
- “扩展”是Shopify添加的额外信息,例如查询的成本
我们来仔细看看成本下次吧,所以现在不用担心。
连接和边缘
连接是相关对象之间的链接。它们允许您进行嵌套查询,通过在单个GraphQL调用中遍历多个对象的连接来收集它们的信息。
当使用连接时,你需要选择“edges”字段。edges字段是同一类型对象的数组,例如商店的订单。一旦你选择了边,你会想要通过节点字段访问各个对象。
在节点字段上,可以选择要返回的对象字段。这些字段将在edges数组中的每个对象上被选中。
最后,在使用连接时,总是需要选择希望返回的对象数量(在集合中第一个或最后一个)。关于这方面的更多信息,请参见分页部分.
该查询获取产品的连接,该连接可从QueryRoot获得,并请求前三个产品。它从每个返回的产品对象中选择边、节点和字段。
由于产品也有一个变体连接,我们重复一个类似的过程来获得关于每个产品的前五个变体的信息。
使用查询参数筛选连接
在许多连接中,你会想要过滤边的列表,以找到你真正感兴趣的特定对象(即特定的节点
S的集合边缘
).
属性可以确定连接支持筛选的字段查询
参数。至于格式化筛选器,语法遵循搜索语法所指导.
该查询查找已完成的前10个订单。
按ID划分的单个对象
通过联系获取信息是很好的,但有时我们可能想要更直接的东西。
值得庆幸的是,我们还可以通过对象的GraphQL ID直接访问对象。
看看我们的QueryRoot同样,我们可以看到有多个查询需要一个GraphQL ID作为输入,并返回该对象。最好总是选择您正在查询的任何对象的ID,以便稍后可以直接引用它。
请注意:确保你在这里使用的是GraphQL ID,而不仅仅是复制粘贴一个REST ID。
的从REST迁移指南有关于从REST中获取GraphQL id的更多信息。
该查询通过ID获取单个产品,并指定希望返回哪些字段。
您可以很容易地从前面“Connections and Edges”查询的响应中获得该查询的产品的GraphQL ID。如果您不这样做,您将得到一个“null”响应,因为您正在寻找一个在您的商店中不存在的产品ID。
3.突变结构实例
现在我们已经了解了使用GraphQL请求数据的来由,下面我们将讨论如何修改它。
基础知识和输入
突变相当于REST的POST/PUT/DELETE操作,允许您创建和修改对象。它们并不直接绑定到资源,因此确定它们将做什么通常归结于命名约定和阅读文档。
与查询一样,在GraphQL中,您总是必须选择希望返回哪些数据。通常,突变将返回创建/修改的对象,这为您提供了一个选择GraphQL ID的绝佳机会(特别是在创建之后),以及验证任何关键数据。
最后,突变总是包含一个userErrors
字段。这个字段让您知道您的突变是否有任何错误,以及为什么它可能没有按照预期进行处理。
你应该总是选择userErrors
字段来帮助您自己进行故障排除。如果没有任何问题,那么userErrors
字段为空。
这种突变创建了一个新客户。我们还传入输入,这是一个JSON对象,其中包含我们希望客户拥有的数据。
突变通常需要输入,您可以通过检查文档来查看可以将哪些字段添加到输入散列中。首先,查看突变并查看它期望的输入类型。其次,检查输入的文档中所有可用的字段。例如,的CustomerInput
页面列出所有可用的输入。
请注意:如果你得到一个“拒绝访问”的错误消息,确保你的应用程序有客户读写权限。
我们也将选择这些字段,以确认它们已正确设置。
输入v2
突变输入也可能需要id,例如在创建订单时。
在前面的变更中,您应该在创建之后收到客户的GraphQL ID(如果您选择了它)。让我们继续使用它为该客户创建一个新的订单草稿。
为了正确格式化我们的输入,我们将参考参考文档draftOrderCreate,DraftOrderInput,DraftOrderLineItemInput.
Insomnia应该从可用的字段中自动完成字段名,因此文档不是完全必要的,因为模式是由Insomnia自动加载的。
请注意:如果你得到一个“访问拒绝”错误消息,确保你的应用程序有DraftOrders读写权限。
4.GraphQL变量
为了加速和重用我们的工作,我们将利用GraphQL的本地变量实现。
变量
GraphQL变量允许您使用不同的参数重用相同的查询/变化。
在Insomnia中,查询变量被分离到编辑器的下部。对于下面的每个示例,您都必须将您的值添加到变量中。如果不这样做,就意味着您将试图查询我的商店的数据,您应该会收到一个“null”响应。
对于我们的示例,让我们找到刚刚创建的订单草稿,并使用返回给我们的ID作为变量的一部分。
让我们逐行执行,看看变量是如何被拉入查询的。
5.分页
为了优化我们要查询的数据量,让我们看看如何在GraphQL中遍历对象。
什么是pageInfo?
当请求连接时,我们必须总是请求完整结果的子集,使用“first”或“last”参数。这意味着在查看“订单”时,我们将只看到前X个订单,然后能够从这些订单中选择我们想要的字段。这对于出现在第一个(或最后一个)X中的项目非常有用,但我们如何获得更多的中心元素呢?
在每个连接上,都有一个“pageInfo”字段,与edges处于同一级别。pageInfo字段包含我们所请求的连接的当前子集的信息。值得注意的是,我们希望检出“hasNextPage”字段,如果连接中有更多当前子集未显示的元素,则该字段返回true。
该查询获取前10个订单,并询问是否还有更多订单。
光标
对于分页来说,仅仅知道连接中存在下一组(X个对象)是不够的。我们还必须找到一种方法来引用它。
游标是连接边缘上下文中对节点(对象)的引用。通过稍微修改我们的查询,我们可以请求游标之前或之后的节点。
让我们再看一下之前的查询,并请求当前边的游标。
该查询获取前10个订单,并询问是否还有更多订单。它还请求那条边的光标。
光标v2
使用游标,我们已经准备好遍历整个连接。
在每个连接上,您都可以指定“after”参数,它告诉服务器在这个特定游标之后将结果返回给您。使用上一个查询中为“游标”返回的值作为这个查询中的“after”参数来获取下一组边。不要忘记将包含的游标变量值替换为您自己的值。
请注意:这本质上等同于在REST管理API上使用“since_id”。
让我们再看一下之前的查询,并请求当前边的游标。
6.先进的
至此,您已经学习了开始GraphQL之旅所需的所有内容。OB欧宝娱乐APP如果你仍然渴望获得技巧和窍门,请继续阅读。
Fragments:处理多个案例
片段是GraphQL的一个概念,它允许您直接在查询中构建一些灵活性。它们被标记为“…on
使用QueryRoot上的"node"字段,我们可以通过ID查询特定的对象。这将返回对象(在“node”字段下或作为“nodes”连接下的边)作为具有基本类型的节点对象,这将不允许我们请求任何更深层次的信息。然而,使用片段,如果节点属于该类型,我们可以请求更具体的类型数据。这对于没有通过QueryRoot访问点的节点特别有用,比如单个lineItem。
让我们使用到目前为止学到的所有知识来找出lineItem的存储位置,这样我们就可以从该位置实现它。
该查询使用节点QueryRoot字段。我们请求从某个地方获得的ID,例如以前订单或游标查询中的行项。
多个查询:一个请求
您可以在单个GraphQL请求中提交多个查询或突变。这实际上没有任何限制速率的好处,因为查询的复杂性仍然加在一起,但对于任何其他约束,使您更容易发送一个多请求,这是如何做到的。
重点是:
- 在顶部声明类型,查询或突变
- 每个单独的查询必须被命名
< your-custom-name >: <查询/ mutation-name-you-are-invoking >
- 查询不一定是相同的
- 每个单独的查询必须选择希望返回哪些字段
这种多重突变为三个不同的客户设置了三个不同的标签。
为Shopify商家开发应用程序
无论您是想为Shopify应用商店开发应用程序,提供私人应用程序开发服务,还是正在寻找扩大用户基础的方法,Shopify合作伙伴计划都将为您的成功奠定基础。免费加入并获得教育资源、开发人员预览环境和经常性收入分享机会。
报名