GraphQL 片段 JSON 格式

Posted

技术标签:

【中文标题】GraphQL 片段 JSON 格式【英文标题】:GraphQL fragment JSON format 【发布时间】:2018-03-23 15:44:33 【问题描述】:

我正在尝试使用他们的 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 过度曝光而崩溃之前让我走上正确的道路。

【问题讨论】:

编辑:为@Scriptonomy 添加 【参考方案1】:

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

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

【讨论】:

我试了一下这个版本,但得到了 400 响应码。我已经在这个版本的问题编辑中包含了完整的 POST 数据(所有内容都用引号括起来),以防你或其他人看到它并说:“嗯,呃,你做了 THING错了。”【参考方案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 解析器。

【讨论】:

示例链接已损坏 这确实没有向所提出的问题添加任何信息。 Plus 链接仍然断开。 我成功了!希望我能更多地关注你的答案:D【参考方案3】:

对于未来的用户,以及像我这样偶然发现这个障碍的人。

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

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

希望这对其他人有所帮助。

【讨论】:

以上是关于GraphQL 片段 JSON 格式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中发送带有片段的 graphql 查询

如何将数据的 JSON 格式转换为 GraphQL 查询格式

GitHub GraphQL API 的 Apollo 客户端响应不是 JSON 格式

GraphQL 片段的片段

在graphql中嵌套片段

nestjs 是不是支持 graphql 片段?