在Python中使用GraphQL的教程

1,294 阅读7分钟

从Netflix到Shopify再到PayPal的组织都认为GraphQL是提供外部应用程序化接口(API)的事实标准。它是在通信和服务组成方面的最新进展,建立在以前的努力(如REST和SOAP)的经验教训之上。

GraphQL提供了广泛的好处,包括:

  • 比REST或SOAP更高层次的灵活性
  • 在一次调用中提供嵌套数据的能力--不再需要获取数据1,从而可以运行查询2,这使得GraphQL成为低带宽应用的理想选择,如。
  • 电话应用和物联网设备的理想选择。

如果你想为你的项目增加一层互操作性,那么它非常值得一看,特别是如果你期望支持来自应用程序和/或设备的连接。

正如你所期望的那样,GraphQL的查询语言包括使用动词对资源进行基本操作的能力(如创建、更新和删除),你可能在使用REST API时熟悉这些动词。但它的语法提供了大量的灵活性,这在RESTful等方法中是很难实现的。而且GraphQL APIs使用Python非常容易操作。

在本教程中,我们将 通过 GQL 3 GraphQL Client for Python探索 ActiveState的GraphQL API

在你开始之前:安装GraphQL Python环境

为了跟上本文的代码,你可以下载并安装我们预先建立的 GraphQL环境,它包含Python 3.9的版本和本文中使用的软件包,以及已经解决的依赖关系

为了下载这个随时可用的Python环境,你需要创建一个 ActiveState Platform 账户。只需使用你的GitHub凭证或你的电子邮件地址来注册。注册很简单,它为你解锁了ActiveState Platform的许多好处!

或者你也可以使用我们的 State工具 来安装这个运行时环境。

ActiveState Platform graphQL

对于Windows用户,在CMD提示下运行以下程序,自动下载并安装我们的CLI、State工具以及 GraphQL运行 时到一个虚拟环境中:

powershell -Command "& $([scriptblock]::Create((New-Object Net.WebClient).DownloadString('https://platform.activestate.com/dl/cli/install.ps1'))) -activate-default Pizza-Team/GraphQL"

对于Linux或Mac用户,运行以下程序,自动下载并安装我们的CLI、State Tool 以及GraphQL运行时 到虚拟环境中:

sh <(curl -q https://platform.activestate.com/dl/cli/install.sh) --activate-default Pizza-Team/GraphQL

开始使用GraphQL APIs

GraphQL的许多好处之一是它是 自我记录的,鉴于一些API的文档和它们的实际实现之间的差距,这是一个大问题。它有它的局限性(就像大多数东西一样),但它总体上工作得相当好。

ActiveState提供了一个 快速入门教程 ,这样你就可以在短时间内让他们的GraphQL启动和运行。由于图表胜过千言万语,让我们从查询API开始,以便用这个优秀的 GraphQL Visualizer 获得一个兼容的模式 :

query IntrospectionQuery {

你可以直接在ActiveState GraphQL 沙盒中运行查询 ,并粘贴结果,以获得一个漂亮的可用类型的定向图示:

working with graphql in python

自省是GraphQL标准的一个关键概念,因为它提供了一种机制来获取API的实际查询能力和限制。欲了解更多信息,请查看GraphQL 文档中的详细例子 。

用GraphQL在Python中进行查询

现在我们可以实际看到什么样的数据是可用的,让我们建立一些基本的查询并探索一些项目。我们的目标组织将是著名的 Pizza-Team,它有许多不同语言的有趣项目。下面的代码查询Pizza-Team的所有项目,只返回它们的名字。

import

这段代码包含了一些有趣的小块,让我们把它分解一下。

  • 第一部分定义了一个与API通信的传输协议。它可以使用HTTP(同步/异步)或WebSockets协议。在这种情况下,同步的HTTP客户端是基于 Requests 库 的。 有趣的是,你可以根据被检索的模式动态地验证查询。你还可以指定在通信失败的情况下执行重试的次数。
  • 第二部分提供了查询的内容。正如你所看到的,参数 org 是必需的, 每个项目 只有 名称 和 描述 属性被返回。
  • 代码的最后一部分运行查询,返回一个JSON对象,使用Pandas json_normalize 函数进行解析 ,以 获得一个DataFrame。

用于查询GraphQL的特定领域语言

特定领域语言(DSL)是与环境紧密结合的专门工具。在这种情况下,你可以把每个GraphQL模式看作是DSL的种子。幸运的是,GQL客户端库可以根据客户端检索到的模式生成一个简单的DSL。

你可以重建之前的查询,而不使用长字符串格式,如下所示。

ds = DSLSchema(client.schema)

这段代码相当简单:

  1. 基于先前检索到的客户模式,创建一个DSL模式的实例。
  2. 使用所需操作的构造函数(DSLQuery、DSLMutation或DSLSubscription)。
  3. 通过使用自动生成的属性在模式中导航来建立查询的主体。

可参数化的查询

DSL方法还有其他优点,比如通过参数定制查询的能力。为了说明这一点,让我们为Pizza-Team的两个项目建立一个依赖图。 AutoML-ToolsSocial-Distancing

首先,我们创建一个参数化的查询,接受项目的名称,并返回来源的依赖关系及其版本。

#builds the query using the DSL

在这个片段中有一些有趣的东西,所以让我们把主要的部分分解一下。

第一部分使用前面提到的DSL创建了一个查询,但这次使用了一个嵌套图模型。

  1. 它 为每个 项目选择相关的 提交
  2. 获取 ID
  3. 返回 与该 提交相关的 每个 源代码的名称 和 版本

第二部分使用 DataFrame 对 commit.sources 列应用一个简单的 lambda 函数来计算依赖关系的数量 。

ActiveState Runtime environments其他考虑因素

除了查询之外,GraphQL还支持另外两种类型的操作:

  • 突变 是经典的 "创建、更新和删除 "操作。
  • 订阅是监听服务器数据变化的连接。它们通常基于WebSockets协议,并允许你根据数据中发生的事件来建立管道。

这些例子中使用的同步HTTP传输是一个很好的起点,但考虑到现代应用程序中管理的数据规模越来越大,你可能不得不转向异步方法。幸运的是,除了WebSockets之外,GQL库还支持异步的HTTP传输。

结论 - 使用GraphQL的程序化查询

使用GraphQL有巨大的优势,包括:

  • 为开发人员提供灵活性,只检索他们需要的信息。
  • 自带文档的API图
  • 减少有效载荷
  • 快速的数据检索

此外,使用DSL将GraphQL模式映射到本地代码的能力为提高你的开发速度提供了一种平稳的方式。提供GraphQL作为你的应用程序的一部分将有助于促进互操作性,你也可以利用服务提供商提供的实现。

ActiveState平台已经使用GraphQL公开了他们的API,使得查询他们的Python包目录很容易,比如漏洞信息和开源许可证。很快,你还可以使用API来查询。

  • 软件材料清单(SBOM) --你项目中所有依赖的完整清单,以及每个依赖的名称、供应商/作者、版本、许可证、时间戳和依赖关系--所有这些都可以用来满足美国政府的SBOM要求。

接下来的步骤:

Python Environment for GraphQL