GraphQL片段JSON格式

时间:2017-10-11 20:39:43

标签: graphql

我试图用他们的v4(GraphQL)API从GitHub中读取一些数据。我编写了一个工作正常的Java客户端,直到我开始用GraphQL片段替换一些查询。

我正在使用GraphiQL来初步测试我的查询,并且在那里添加片段非常简单。但是,在转换为JSON时,我还没有找到正确的格式。我试过了:

{ "query": "{ ... body_of_query ... } fragment fragname on Blob { byteSize text }" }

{ "query": "{ ... body_of_query ... }, fragment fragname on Blob { byteSize text }" }

{ "query": "{ ... body_of_query ... }", "fragment": "{fragname on Blob { byteSize text } }" }

编辑:添加@Scriptonomy:

{
 query {
   search(first:3, type: REPOSITORY, query: \"language:HCL\") {
     edges {
      node {
        ... on Repository {
          name
          descriptionHTML
          object(expression: \"master:\") {
            ... on Tree {
              ...recurseTree
            }
          }
        }
      }
      cursor
    }
    pageInfo {
      endCursor
      hasNextPage
    }
  }
}

fragment recurseTree on Tree {
  entries {
    name
    type
  }
}

肯定这将是有趣的,并继续抛出随机的变化,我的早上非常有趣的搜索片段上的各种GraphQL文档和博客,我甚至可能实际上猜到了正确的答案但却有不匹配的问题(我只是使用硬编码的JSON,直到我知道格式 - 也许不是回顾它的最明智的选择)。

我希望有人可能知道正确的格式,并在我从GraphQL-doc过度曝光中找到正确的路线之前。

3 个答案:

答案 0 :(得分:2)

片段在JSON主体的同一属性中与查询本身一起发送。您可以看到使用片段here的示例。

有效的GraphQL请求通常是将查询编码为URL查询参数的GET请求,或者是带有JSON正文的POST请求。 JSON正文包含一个必需的键query和一个可选字段variables。在您的情况下,JSON需要如下所示:

{
  "query": "{\n query {\n   search(first:3, type: REPOSITORY, query: \"language:HCL\") {\n     edges {\n      node {\n        ... on Repository {\n          name\n          descriptionHTML\n          object(expression: \"master:\") {\n            ... on Tree {\n              ...recurseTree\n            }\n          }\n        }\n      }\n      cursor\n    }\n    pageInfo {\n      endCursor\n      hasNextPage\n    }\n  }\n}\n\nfragment recurseTree on Tree {\n  entries {\n    name\n    type\n  }\n}"
}

这是您问题中逐字查询字符串的JSON.stringify版本。

我建议您从连接到GitHub GraphQL API的GraphiQL实例运行查询,并查看网络请求。您可以将GraphQL请求复制为cuRL,以查看JSON正文的外观。

如果您仍然获得400,请分享一些代码,因为这意味着您的请求格式错误,因此它可能从未首先访问过GraphQL解析器。

答案 1 :(得分:0)

无需将GraphQL查询转换为JSON。这将是您的查询:

"{ query { ... body_of_query ... } fragment fragname on Blob { byteSize text } }"

答案 2 :(得分:0)

对于将来的用户,以及偶然遇到此障碍的像我这样的人。

查询需要以给定的顺序发送;

{ "query": "fragment fragname on Blob { byteSize text } methodName(ifMethodParam: paramVal){...fragname }" }

希望这对其他人有帮助。