【问题标题】:GraphQL: Explore API without a wildcard (*)?GraphQL:探索没有通配符 (*) 的 API?
【发布时间】:2019-07-22 22:13:26
【问题描述】:

我是 GraphQL 新手,我想知道如何在没有通配符 (*) (https://github.com/graphql/graphql-spec/issues/127) 的情况下探索 API。

我目前正在使用 GraphQL 设置无头 Craft CMS,但我真的不知道我的数据是如何嵌套的。

使用 REST API 的事件我没有机会只获取所有数据,因为我必须设置所有端点,因此我还必须知道所有字段名称。

那么我怎样才能轻松探索我的 CraftCMS 数据结构呢?

感谢您对此的任何提示。

干杯

merc

----- 编辑 -------- 如果我使用@simonpedro 的建议:

{
  __schema {
    types {
      name
      kind
      fields {
        name
      }
    }
  }
}

我可以看到很多类型 (?)/字段 (?)... 例如我看到:

{
      "name": "FlexibleContentTeaser",
      "kind": "OBJECT",
      "fields": [
        {
          "name": "id"
        },
        {
          "name": "enabled"
        },
        {
          "name": "teaserTitle"
        },
        {
          "name": "text"
        },
        {
          "name": "teaserLink"
        },
        {
          "name": "teaserLinkConnection"
        }
      ]

但现在我想知道teaserLink 的结构。 我不知何故发现teaserLink(它是一个类型为Entries的字段,我可以在其中链接到另一个页面)具有属性urltitle

但是我将如何设置查询来探索teaserLink 中可用的属性?

我尝试了各种查询,但总是遇到这样的消息:

如果有人能给我另一个指针,我会很高兴我可以找出我可以实际查询的属性...

谢谢

【问题讨论】:

    标签: graphql craftcms headless-cms


    【解决方案1】:

    就我而言,目前没有具有该功能的 graphql 实现。但是,如果您想做的是探索“数据结构”,即模式,您应该使用模式自省,这是为此考虑的(探索 graphql 模式)。例如,一个简单的 graphql 自省查询应该是这样的:

    {
      __schema {
        types {
          name
          kind
          fields {
            name
          }
        }
      }
    }
    
    

    参考资料: - https://graphql.org/learn/introspection/

    更新编辑:

    我认为您想要做的事情如下: 进行这样的查询

    {
      __schema {
        types {
          name
          kind
          fields {
            name
            type {
              fields {
                name
              }
            }
          }
        }
      }
    }
    
    

    然后找到希望的类型字段以从中获取更多信息(字段)。像这样的东西(我不知道这是否有效,只是一个想法):

    const typeFlexibleContentTeaser = data.__schema.types.find(t => t === "FlexibleContentTeaser")
    
    const teaserLinkField = typeFlexibleContentTeaser.fields.find(f => f.name === "teaserLink")
    
    const teaserLinkField = teaserLinkField.type.fields;
    

    即,您必须递归遍历 type 字段。

    【讨论】:

    • 看起来很有希望。我会看看。谢谢
    • 我个人更喜欢看到一个充满数据的完整 API 来探索它,但这绝对解决了我的问题。谢谢
    • 好吧,我还有另一个问题:使用您的解决方案,我只能看到根目录中的属性,但我想知道里面有什么。 (我将编辑我的问题以具有更多编辑功能... --> 见上文)
    • 嗯,谢谢您进一步详细说明。不幸的是,我并不真正了解这个过程。我确实进行了查询,但是我应该把 JS 代码放在哪里?我认为使用上面的查询获取数据不包含想要的字段......还是我错了?据我了解,您的数据对象不知何故已经包含了所有内容,还是我错了?
    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 2019-01-03
    • 1970-01-01
    • 2014-02-14
    • 2010-10-22
    • 2021-12-01
    • 2017-07-25
    • 2021-12-24
    相关资源
    最近更新 更多