跳转到内容

GraphQL API

GraphQL API 是一种工具,允许您使用更具针对性的灵活查询精确获取所需数据。 GraphQL API 的主要优势之一是您可以通过单个请求获取多种不同的资源。

如果您想针对 Crowdin GraphQL API 运行查询,我们建议使用 GraphQL Playground 应用,借助该应用,您可以在编写任何应用程序代码之前,直接从 Crowdin 和 Crowdin Enterprise Web 界面构建、测试和调试查询。

要在 Crowdin 或 Crowdin Enterprise 中使用 GraphQL API,请使用以下访问令牌之一:

请确保在您的请求中使用以下标头:

终端窗口
Authorization: Bearer <ACCESS_TOKEN>

如果认证失败,响应如下:

401 Unauthorized

{
"error": {
"message": "Unauthorized",
"code": 401
}
}

与 REST API 不同,GraphQL API 只有一个恒定的端点,不依赖于所执行的操作。

Crowdin GraphQL endpoint:

终端窗口
https://api.crowdin.com/api/graphql

Crowdin Enterprise GraphQL endpoint:

终端窗口
https://{domain}.api.crowdin.com/api/graphql

Crowdin GraphQL API 设有限制,以防止对 Crowdin 服务器的过度或滥用调用。

所有 GraphQL API 调用必须符合以下要求才能通过 schema 验证:

  • 用户必须在任何 connection 上提供 firstlast 参数。
  • firstlast 的值必须在 1 到 10,000 之间。
  • 单次调用请求的总节点数不能超过 10,000 个。

在以下示例中,您可以了解一次调用中节点的计算方式。

query {
viewer {
projects(first: 50) {
edges {
node {
name
files(first: 10) {
totalCount
edges {
node {
name
type
}
}
}
}
}
}
}
}

计算方式:

50 = 50 projects
+
50 x 10 = 500 files
= 550 total nodes
query {
viewer {
projects(first: 50) {
edges {
node {
files(first: 20) {
edges {
node {
strings(first: 10) {
edges {
node {
... on PlainSourceString {
text
}
... on ICUSourceString {
text
}
... on PluralSourceString {
plurals {
one
other
}
}
... on AssetSourceString {
text
}
}
}
}
}
}
}
translations(first: 20, languageId: "uk") {
edges {
node {
... on PlainStringTranslation {
text
}
... on ICUStringTranslation {
text
}
... on PluralStringTranslation {
pluralForm
text
}
... on AssetStringTranslation {
text
}
}
}
}
}
}
}
}
}

计算方式:

50 = 50 projects
+
50 x 20 = 1,000 files
+
50 x 20 x 10 = 10,000 strings
+
50 x 20 = 1,000 translations
= 12,050 total nodes

GraphQL API 的限制与 REST API 速率限制 有很大不同。

如前所述,您只需一次 GraphQL 调用即可获取与多次 REST 调用相同数量的数据。虽然单个复杂的 GraphQL 调用可能等同于数千次 REST 请求,且不会超过 REST API 速率限制,但其计算开销对 Crowdin 服务器来说可能同样高昂。

GraphQL API 使用归一化积分制,通过计算调用的速率限制分数来精确反映查询的服务器成本。该分数包括父 connection 及其子项上的 first 和 last 参数。

  • 该公式使用父 connection 及其子项上的 firstlast 参数来预先确定对 Crowdin 系统(如 MySQL 和 ElasticSearch)的可能负载。
  • 每个新 connection 都有自己的积分值。这些积分会与调用的其他积分相加,形成最终的速率限制分数。

GraphQL API 的速率限制设置为每小时 5,000 积分。由于 GraphQL API 和 REST API 使用不同的速率限制,每小时 5,000 积分并不等同于每小时 5,000 次调用。

要在使用 GraphQL API 时检查速率限制状态,请查询 rateLimit 对象上的字段:

query {
viewer {
username
}
rateLimit {
limit
cost
remaining
resetAt
}
}
  • limit – 返回用户在 60 分钟时间窗口内允许消耗的最大积分数。
  • cost – 返回当前调用计入速率限制的积分成本。
  • remaining – 返回当前速率限制时间窗口内剩余的积分数。
  • resetAt – 返回当前速率限制时间窗口重置的时间,以 UTC epoch 秒为单位。

虽然查询 rateLimit 对象可以获取调用的分数,但这会计入限制。为绕过这一问题,您可以提前估算调用的分数。使用以下计算方法,您可以获得与 rateLimit { cost } 返回值大致相同的成本。

  1. 首先,将调用中每个唯一 connection 所需的请求数加总。假设每个请求都会达到 firstlast 参数的限制值。
  2. 然后,将该数字除以 100 并取整,即可得到最终综合成本。此步骤用于将较大的数字归一化。

以下是一个示例查询及其分数计算:

query {
viewer {
username
projects(first: 100) {
edges {
node {
id
files(first: 50) {
edges {
node {
id
strings(first: 60) {
edges {
node {
... on PlainSourceString {
id
text
}
... on ICUSourceString {
id
text
}
... on PluralSourceString {
id
plurals {
one
other
}
}
... on AssetSourceString {
id
text
}
}
}
}
}
}
}
}
}
}
}
}
  • 在返回 100 个项目时,API 需要连接到用户账户一次以获取项目列表。因此,项目的请求数 = 1
  • 在返回 50 个文件时,API 需要连接到 100 个项目中的每一个以获取文件列表。因此,文件的请求数 = 100
  • 在返回 60 个字符串时,API 需要连接到最多 5,000 个文件中的每一个以获取字符串列表。因此,字符串的请求数 = 5,000
  • 总计 = 5,101

现在,将总计 5,101 除以 100 并取整。最终得到该查询的分数为 51。

分页是 GraphQL 中的一个基本概念,允许您从较大的数据集合中检索数据子集,使信息的管理和展示更加便捷。

在本节中,我们将以 projects 字段为例,探讨如何在 Crowdin GraphQL API 中使用分页。

在深入了解分页的具体使用方式之前,让我们先澄清一些关键术语:

  • Connection – 在 Crowdin GraphQL 中,connection 是一种包含条目列表的结构。它通常包含 edges、pageInfo 和 totalCount。 edges 包含实际数据条目,pageInfo 提供分页相关信息,totalCount 表示 connection 中的条目总数。
  • Edges – edges 是 connection 中的各个条目。每个 edge 包含 node(数据条目)和 cursor,cursor 是用于在集合中导航的字符串。
  • PageInfo – pageInfo 提供帮助您判断是否还有更多条目可检索的信息。它包含 hasNextPagehasPreviousPagestartCursorendCursor 等字段。

现在,让我们重点介绍如何在 Crowdin GraphQL API 中使用 projects 字段进行分页。

User 类型中的 projects 字段用于查询与用户关联的项目。它接受多个输入参数,允许您控制结果的分页。这些参数包括:

  • after – 一个 cursor,指示查询应从项目列表的哪个位置开始。
  • first – 在指定 cursor 之后要检索的项目数量。
  • before – 一个 cursor,指示查询应在哪个位置结束。
  • last – 在指定 cursor 之前要检索的项目数量。

以下示例查询从提供的 cursor(cursor_string)开始,请求与已认证用户关联的前十个项目。响应将包含含有项目数据的 edges 数组,以及用于分页控制的 pageInfototalCount 字段。

query {
viewer {
projects(
after: "cursor_string", # Replace with a valid `after` cursor
first: 10
) {
edges {
node {
id
name
description
# Add more fields as needed
}
cursor
}
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
totalCount
}
}
}

以下是上述查询的响应示例:

{
"data": {
"viewer": {
"projects": {
"edges": [
{
"node": {
"id": 1,
"name": "Umbrella",
"description": "Official Umbrella Translation Project"
},
"cursor": "MA=="
},
{
"node": {
"id": 2,
"name": "Umbrella iOS",
"description": "Official Umbrella iOS App Translation Project"
},
"cursor": "MQ=="
}
],
"pageInfo": {
"hasNextPage": true,
"hasPreviousPage": false,
"startCursor": "MA==",
"endCursor": "MQ=="
},
"totalCount": 5
}
}
}
}
  • hasNextPagepageInfo 中的此字段指示下一页是否还有更多可用项目。
  • hasPreviousPagepageInfo 中的此字段指示上一页是否还有更多可用项目。
  • startCursor – 指向当前结果集中第一个项目的 cursor。
  • endCursor – 指向当前结果集中最后一个项目的 cursor。
  • totalCount – 与该用户关联的项目总数。

在某些情况下,您可能需要在数据集中向后翻页。这可能出于各种原因,例如:查看较早的数据、更正或修改等。

要向后翻页,您可以使用 lastbefore 参数。 last 参数指定从列表末尾起要获取的条目数量,before 参数接受您想要检索的第一个条目的 cursor。以下是一个示例:

query {
viewer {
projects(
last: 10,
before: "cursor_of_first_item" # Replace with a valid `before` cursor
) {
edges {
node {
id
name
description
# Add more fields as needed
}
}
}
}
}

Crowdin GraphQL 提供了筛选和排序(排序)数据的功能,允许您缩小想要检索的数据范围,并按特定顺序排列数据。

与分页类似,在本节中,我们将以 projects 字段为例,探讨如何在 Crowdin GraphQL API 中使用筛选和排序功能。

筛选是指定条件以从较大数据集中选取数据子集的过程。在 Crowdin GraphQL 中,筛选允许您根据特定条件缩小查询结果的范围。当您想要检索满足特定要求或特征的数据时,这尤其有用。

Crowdin GraphQL 提供了 ProjectFilterInput 类型,允许您根据各种属性筛选项目。以下是一些可用于筛选的关键属性:

  • and – 逻辑合取运算符,用于组合多个筛选条件。
  • or – 逻辑析取运算符,用于组合多个筛选条件。
  • id – 使用各种条件(如等于、大于或小于)按项目 ID 筛选。
  • userId – 按与项目关联的用户 ID 筛选项目。
  • name – 按项目名称筛选,可检查等于、包含或以特定文本开头等条件。
  • identifier – 按项目标识符筛选,类似于按名称筛选。
  • description – 按项目描述筛选,可检查等于、包含或以特定文本开头等条件。
  • publicDownloads – 根据是否启用公开下载来筛选项目。
  • languageAccessPolicy – 按项目的语言访问策略筛选(例如,“open” 或 “moderate”)。
  • visibility – 根据项目的可见性筛选(例如,“open” 或 “private”)。
  • createdAt – 使用各种日期相关条件按项目创建日期筛选。
  • updatedAt – 按项目最后更新日期筛选。
  • lastActivityAt – 按项目最后活动日期筛选。

筛选是一种灵活的方式,可以精确定位查询中所需的数据。您可以使用 andor 等逻辑运算符组合多个筛选条件,进一步细化查询。

要检索在特定日期之后创建且可见性设置为 “private” 的项目,您可以创建如下筛选输入:

query {
viewer {
projects(
first: 10,
filter: {
createdAt: { gt: "2023-01-01T00:00:00Z" }
and: { visibility: { equals: private } }
}
) {
edges {
node {
id
name
description
# Add more fields as needed
}
}
}
}
}

此筛选条件将返回同时满足两个条件的项目:在 2023 年 1 月 1 日之后创建,且可见性设置为 “private”。

排序是指定查询结果呈现顺序的过程。它不会减少结果数量,而是将结果按特定顺序排列。 Crowdin GraphQL 提供了基于项目名称、创建日期或其他相关因素对数据进行排序的选项。

Crowdin GraphQL 中的 ProjectOrderInput 类型允许您指定查询结果的排序顺序。您可以根据以下属性对项目进行排序:

  • id – 按项目的唯一标识符排序。
  • userId – 按创建项目的用户标识符排序。
  • name – 按项目名称排序。
  • identifier – 按项目标识符排序。
  • description – 按项目描述排序。
  • publicDownloads – 按项目的公开下载设置排序。
  • languageAccessPolicy – 按项目的语言访问策略排序。
  • visibility – 按项目的可见性设置排序。
  • createdAt – 按项目创建日期排序。
  • updatedAt – 按项目最后更新日期排序。
  • lastActivityAt – 按项目最后活动日期排序。

您可以将排序顺序指定为升序(“asc”)或降序(“desc”),从而完全控制数据的呈现方式。

要检索按名称降序排列的项目,您可以创建如下排序输入:

query {
viewer {
projects(
first: 10
order: [{ name: desc }]
) {
edges {
node {
id
name
description
# Add more fields as needed
}
}
}
}
}

此排序顺序将按项目名称的反字母顺序呈现项目。

Crowdin GraphQL 允许您同时结合筛选和排序,以精确定制查询。您可以先筛选数据以选取满足特定条件的子集,然后按所需顺序对结果进行排序。这种组合方式使您能够根据具体需求检索和排列数据。

要检索在特定日期之后创建、具有 “moderate” 语言访问策略的项目,并按最后活动日期升序排列,您可以创建如下查询:

query {
viewer {
projects(
first: 10
filter: {
createdAt: { gt: "2023-01-01T00:00:00Z" }
and: { languageAccessPolicy: { equals: moderate } }
},
order: [{ lastActivityAt: asc }]
) {
edges {
node {
id
name
description
# Add more fields as needed
}
}
}
}
}

此查询将返回满足筛选条件的项目,并按最后活动日期升序呈现。

本页面对你有帮助吗?