当前位置: 首页 > 知识库问答 >
问题:

GraphQL响应中的自定义映射键

淳于飞鸾
2023-03-14

我一直在研究GraphQL作为我的一些RESTAPI的替代品,虽然我认为我已经对基本知识了如指掌,就像我目前看到的大多数内容一样,但似乎缺少了一个重要的功能

比如说,我有一系列这样的物品:

{
    "id": "aaa",
    "name": "Item 1",
    ...
}

应用程序需要所有这些对象的映射,按ID索引:

{
    "allItems": {
        "aaa": {
            "name": "Item 1",
            ...
        },
        "aab": {
            "name": "Item 2",
            ...
        }
    }
}

我写过的每个API都能够以这样的格式返回结果,但我正在努力寻找一种用GraphQL来做到这一点的方法。我一直在运行第101个问题,但这更多地涉及未知模式。就我而言,我确切地知道所有字段是什么;这纯粹是关于输出格式。我知道我可以简单地返回数组中的所有项目并在客户端重新格式化它,但考虑到过去从未需要它,这似乎有些矫枉过正,并且会让GraphQL感觉像是倒退了一步。我不确定我想做的是不可能的,还是我只是使用了所有错误的术语。我应该继续挖掘,还是GraphQL不适合我的需求?如果这是可能的,那么检索这样的数据的查询会是什么样子?

我目前正在服务器上使用graphql php,但我对更高层次的概念性响应持开放态度。

共有1个答案

冯流觞
2023-03-14

不幸的是,像这样返回带有任意动态键的对象在GraphQL中并不是一级公民。这并不是说你不能实现同样的事情,但这样做你会失去GraphQL的许多好处。

如果您设置返回带有id键的对象,而不是返回包含id的对象集合/列表,然后在客户端上进行转换,那么您可以创建一个特殊的GraphQLScalarType。

const GraphQLAnyObject = new GraphQLScalarType({
  name: 'AnyObject',
  description: 'Any JSON object. This type bypasses type checking.',
  serialize: value => {
    return value;
  },
  parseValue: value => {
    return value;
  },
  parseLiteral: ast => {
    if (ast.kind !== Kind.OBJECT) {
      throw new GraphQLError("Query error: Can only parse object but got a: " + ast.kind, [ast]);
    }
    return ast.value;
  }
});

这种方法的问题是,由于它是标量类型,因此无法提供选择集来查询它。E、 G.如果你有一个类型

type MyType implements Node {
  id: ID!
  myKeyedCollection: AnyObject
}

那么你只能这样查询它

query {
  getMyType(id: abc) {
    myKeyedCollection  # note there is no { ... }
  }
}

正如其他人所说,我不建议这样做,因为您正在失去GraphQL的许多好处,但这表明GraphQL仍然可以做REST可以做的任何事情。

希望这有帮助!

 类似资料:
  • 我有一个Spring Boot应用程序,我使用RestTemboard调用Rest API,我收到以下JSON格式的响应: 数组“data”中的单个元素几乎没有不同的结构(上面的两个例子),我想用单个元素映射不同的类类型,这取决于元素“type”的值。 例如,值“type1”应该映射到类类型为“type1”的对象,依此类推。 我创建了如下类:MyResponse: 数据: 类型1: 类型2: 如何

  • 以下是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将一个对象转换为另一个对象。我遇到了一些问题,我想找到一个替代方案,这就是我发现MapStruct的方式。 因此,我试图构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数。例如,我想要: 在mapper实现中,我会有如下内容: 如果有人能帮我做到这一点,我将不胜感激,这将节省我很多时间。 提前谢谢。

  • 我有两个对象,除了date成员外,其他成员都相同。在obj1中,date是java.sql.date,obj2.date是long(纪元)。 我需要编写一个映射器来将obj1映射到obj2。这就是我试图做的: 但是mapperImpl只有自己的日期转换实现: 我得到了: 这种转换的正确方式是什么?

  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 问题内容: 我正在尝试使用日期格式索引数据。如Elasticsearch 日期格式文档中所述,我需要使用自定义日期格式。我指的是DateTimeFormat文档,并且各自的格式是。 我能够创建映射,但是当我尝试索引数据时会给我错误。 对应: 索引文件: 错误:- 有什么建议吗? 问题答案: 本月使用三个“ M”。引用API文档: 月:3岁或以上,请使用文字,否则请使用数字。 因此,您提供的输入的正

  • 模型类1 型号2类 Rest控制器 为什么我的对象映射器bean(具有唯一的bean名称)影响了现有默认spring boot对象映射器的功能 在这种情况下,如果我无法使用默认对象映射器控制遗留代码,那么在不破坏遗留代码的情况下定义自定义对象映射器的选项是什么。注意:我不能以任何方式更改遗留代码。 如有任何帮助,不胜感激。