Raj*_*Rao 6 github-api graphql github-api-v4
我希望能够使用他们的 GraphQL API 从 GitHub 检索特定存储库的最新版本。为此,我需要获取最新版本,其中 isDraft 和 isPrerelease 为 false。我已经设法获得了第一部分,但无法弄清楚如何进行查询的“where”部分。
这是我得到的基本查询(https://developer.github.com/v4/explorer/):
{
repository(owner: "paolosalvatori", name: "ServiceBusExplorer") {
releases(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {
nodes {
name
tagName
resourcePath
isDraft
isPrerelease
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
返回:
{
"data": {
"repository": {
"releases": {
"nodes": [
{
"name": "3.0.4",
"tagName": "3.0.4",
"resourcePath": "/paolosalvatori/ServiceBusExplorer/releases/tag/3.0.4",
"isDraft": false,
"isPrerelease": false
}
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到一种方法来做到这一点。部分原因是我是 GraphQL 的新手(第一次尝试进行查询)并且我不确定如何构建我的问题。
只能基于支持参数的类型(例如下面的存储库和版本)“查询”吗?似乎应该有一种方法可以在字段值上指定过滤器。
存储库:https : //developer.github.com/v4/object/repository/
发布:https : //developer.github.com/v4/object/releaseconnection/
只能基于那些支持参数的类型进行“查询”
是的:GraphQL 并没有像 SQL 那样定义通用查询语言。您无法以服务器和应用程序架构未提供的方式对字段结果进行排序或筛选。
我希望能够使用 GraphQl API 从 GitHub 检索特定存储库的最新[非草稿、非预发布]版本。
正如您已经发现的,类型上的字段没有releases对这些字段进行排序或过滤的选项。相反,您可以通过多个 GraphQL 调用一次迭代一个版本。这些单独看起来像Repository
query NextRelease($owner: String!, $name: String!, $after: String) {
repository(owner: $owner, name: $name) {
releases(first: 1,
orderBy: {field: CREATED_AT, direction: DESC},
after: $after) {
pageInfo { lastCursor }
nodes { ... ReleaseData } # from the question
}
}
}
Run Code Online (Sandbox Code Playgroud)
以与现在运行它相同的方式运行它(我已将标识存储库的信息拆分为单独的 GraphQL 变量)。after您可以在第一次调用时省略该变量。如果(如您的示例中所示)它返回"isDraft": false, "isPrerelease": false,则您已设置完毕。如果没有,您需要重试:从响应中获取值lastCursor,然后运行相同的查询,将该游标值作为after变量值传递。
{
repository(owner: "paolosalvatori", name: "ServiceBusExplorer") {
releases(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {
nodes(isDraft :false , isPrerelease :false ) {
name
tagName
resourcePath
isDraft
isPrerelease
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者,请查看 GraphQL 指令,因为有时需要根据值 @skip 或 @include 跳过或包含字段。
Skip 指令在字段或片段上使用时,允许我们根据某些条件排除字段。
include 指令允许我们根据某些条件包含字段