首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在GraphQL中跨rest数据源维护请求上下文

在GraphQL中跨REST数据源维护请求上下文的方法是通过使用数据加载器(DataLoader)和上下文传递。

数据加载器是一个用于批量加载数据的工具,它可以帮助我们在GraphQL解析过程中减少对REST API的请求数量。通过数据加载器,我们可以将多个请求合并为一个批量请求,提高性能并减少网络开销。

要在GraphQL中跨REST数据源维护请求上下文,可以按照以下步骤进行操作:

  1. 创建数据加载器:根据需要,创建一个或多个数据加载器。每个数据加载器负责从REST数据源中加载特定类型的数据。
  2. 定义数据加载器的加载函数:为每个数据加载器定义一个加载函数,该函数接收一组唯一标识符作为参数,并返回对应的数据。
  3. 在GraphQL解析器中使用数据加载器:在GraphQL解析器中使用数据加载器来加载数据。当解析器需要获取数据时,它可以通过数据加载器来批量加载数据,而不是直接调用REST API。
  4. 传递上下文:在GraphQL请求的上下文中传递数据加载器实例。这样,在解析器中可以通过上下文访问数据加载器,并在需要时使用它们。

下面是一个示例代码,演示了如何在GraphQL中跨REST数据源维护请求上下文:

代码语言:txt
复制
const { ApolloServer, gql } = require('apollo-server');
const { RESTDataSource } = require('apollo-datasource-rest');
const DataLoader = require('dataloader');

// 定义GraphQL类型和查询
const typeDefs = gql`
  type User {
    id: ID!
    name: String!
    posts: [Post!]!
  }

  type Post {
    id: ID!
    title: String!
    body: String!
  }

  type Query {
    user(id: ID!): User
  }
`;

// 定义数据加载器类
class UserAPI extends RESTDataSource {
  constructor() {
    super();
    this.baseURL = 'https://api.example.com/users/';
  }

  // 加载用户数据
  async getUser(id) {
    return this.get(id);
  }
}

class PostAPI extends RESTDataSource {
  constructor() {
    super();
    this.baseURL = 'https://api.example.com/posts/';
  }

  // 加载用户的帖子数据
  async getPostsByUserIds(userIds) {
    return Promise.all(userIds.map(userId => this.get(`?userId=${userId}`)));
  }
}

// 创建数据加载器实例
const userLoader = new DataLoader(ids => userAPI.getUsers(ids));
const postLoader = new DataLoader(ids => postAPI.getPostsByUserIds(ids));

// 定义解析器
const resolvers = {
  Query: {
    user: async (_, { id }, { dataSources }) => {
      // 使用数据加载器加载用户数据
      const user = await dataSources.userAPI.getUser(id);
      return user;
    },
  },
  User: {
    posts: async (user, _, { dataSources }) => {
      // 使用数据加载器加载用户的帖子数据
      const posts = await dataSources.postAPI.getPostsByUserIds([user.id]);
      return posts;
    },
  },
};

// 创建Apollo服务器
const server = new ApolloServer({
  typeDefs,
  resolvers,
  dataSources: () => ({
    userAPI: new UserAPI(),
    postAPI: new PostAPI(),
  }),
  context: () => ({
    dataSources: {
      userAPI: userLoader,
      postAPI: postLoader,
    },
  }),
});

// 启动服务器
server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

在上面的示例中,我们定义了一个UserAPI和一个PostAPI,它们分别用于加载用户和帖子数据。然后,我们创建了userLoaderpostLoader数据加载器实例,并将它们作为上下文传递给Apollo服务器。

在解析器中,我们使用数据加载器来加载用户和帖子数据。通过使用数据加载器,我们可以在解析器中批量加载数据,而不是为每个请求单独调用REST API。

这是一个简单的示例,演示了如何在GraphQL中跨REST数据源维护请求上下文。根据实际需求,您可以根据需要创建更多的数据加载器,并在解析器中使用它们来加载数据。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

GraphQL与OpenAPI:数据治理的优缺点

GraphQL 的查询语言没有包含其他标准, HTTP 或 REST。它对客户端和服务器如何通信请求和结果是不可知的。...商业 GraphQL JDBC 驱动程序支持基于 SQL 查询的请求。 OpenAPI OpenAPI 以JSON Schema为基础,并依赖于 HTTP REST。...借助元数据,与底层数据源保持一致更加直接,并且工具使其更容易支持数据治理需求。 由于其专业化重点,GraphQL 可以提供以多种语言实现的参考库。...这些库解析 GraphQL 模式和查询并将它们连接到代码,从而促进数据库和业务逻辑集成到响应。 此请求处理模型提供了支持数据治理目标的挂钩。...结论 GraphQL,作为一种分布式数据生产商群体支持语义层面的 API 策略,具有许多优势。五年前,认真对待 GraphQL 可能比较困难,但技术格局已经发生了改变。

10810

【API架构】REST API 行业辩论:OData vs GraphQL vs ORDS

重点是实现 API 的互操作性,以进行分析、集成和数据管理。...符合 REST 的 Web 服务允许请求系统使用一组统一且预定义的无状态操作来访问和操作 Web 资源的文本表示。RESTful 实现使用 HTTP、URI、JSON 和 XML 等标准。...对比标准 API 图 1 对比图 1 的标准 API 的标准是基于实现与多个数据源的互操作性。关于这种比较需要注意的一点是规范的成熟度。...API 版本控制和维护 一个令人头疼的问题是在 API 更改时处理应用程序的更新,同时还要维护旧版本。导致 REST API 令人头疼的最大问题是,当您查询端点时会返回所有字段。...例子 为了直观地说明使用这些 API 的差异,以下两个代码示例展示了如何在 GraphQL 和 OData 执行“排序依据”。

2.1K30
  • GraphQL最突出的架构优势是什么?

    GraphQL API 的配置工作包括: 安装 GraphQL 公开一个服务器端点 设计一个模式(schema) 将解析器连接到数据源 这是我们需要做的工作,但不是我们项目的工作重心。...5GraphQL 是自文档化的 维护 RESTfulAPI 时需要做的一件麻烦事是保持文档及时更新和内容全面。 RESTfulAPI 有两处可以更改。...通过 Apollo Federation,我们可以绘制并公开由多个 GraphQL 端点组成的单个数据图 在 Federation ,你可以组成模式并解析其他服务 / 限界上下文中的字段。...收到请求时,将从相应的服务解析这些字段。 对于规模庞大的组织来说,这种需求并不罕见。 7单一端点 SOLID 原则的开闭原则指出: “组件 / 系统 / 类应对扩展开放,但对修改封闭”。...在架构层面,由于 GraphQL 仅向客户端公开单个端点,因此它满足了这一原则。 客户端隐藏了字段解析机制的所有复杂性,它只需关注如何在 GraphQL 服务器之上构建即可。

    2.2K20

    2018年微服务的5个发展趋势

    通通过在类型和字段之间定义资源之间的关系(而不是像REST一样的端点),GraphQL可以遵循属性之间的引用,因此服务可以使用单个查询从多个资源接收数据。...另外,REST api要求为一个请求加载多个url,增加网络跳数,减慢查询速度。通过减少往返,GraphQL减少了每个数据请求所需的资源数量。返回的数据通常被格式化为JSON。...与REST相比,GraphQL还有其他好处。首先,客户端和服务器是分离的,所以它们可以分开维护。与REST不同,GraphQL使用类似的语言在客户端和服务器之间进行通信,因此调试更容易。...观察GraphQL何在gRPC的上下文中发展,以及类似Twitch的Twirp RPC框架的替代方案,将是一件有趣的事情。 5. 混沌工程变得更加出名。...混沌工程包含了更广泛的范围,不仅仅是注入故障,还包括其他症状,流量峰值、异常请求组合等,以发现存在的问题。除了验证假设,它还应该显示系统的新属性。

    1.4K20

    边缘服务的一致性、耦合和复杂性

    Apollo GraphQL 框架支持在 schema 中使用缓存提示注解或在解析器动态设置,这可以通过浏览器端缓存或内存缓存或外部缓存 ( Memcached 或 Redis) 来实现。...通常的方法是在测试自动化查询所有的内容,这样做应该足够了,除非解析器需要通过上下文对象交换带外数据。...在生产环境,后端软件通常运行在数据中心(公有云)的服务器上。 后端又被进一步分为数据、边缘和集成服务。 数据服务为数据库提供保护、执行业务规则、维护一致性,并专注于可伸缩性、性能和潜在的弹性问题。...5 结论 你不必纠结于是选择 REST 还是 GraphQLREST 更适合面向平台的数据服务,GraphQL 更适合面向 GUI 的边缘服务。...如果可能的话,降低组件的耦合性。紧密耦合的组件应该由相同的团队负责开发维护,并采用相似或互补的开发技术。你不需要为此大幅改变团队的结构。

    93410

    Coursera 的 GraphQL 之旅

    我还记得当 Facebook 首次推出 GraphQL 时,我们团队都兴奋不已——我们当即意识到 GraphQL 可以解决我们的很多问题,让我们可以在单次的请求获取所有数据,并为我们的 API 提供结构化文档...在生产环境应用 GraphQL 封装 REST API 的过程很简单——我们构建了一些实用程序来执行下游的 REST 请求,从而在解析器获取数据,并制定了一些关于如何将现有模型转换为 GraphQL...首先,我们构建了少量的 GraphQL 解析器,然后在生产环境启动一个 GraphQL 服务器,以调用下游 REST 接口请求我们的资源。...自动化处理 所以我们从头开始,试图找到一个更精确的方案来实现单一数据源——我们将 REST API 视为数据源是有依据的,因为我们的 GraphQL 的 schema 是基于它们构建的。...接下来,我们利用之前解析器的大部分逻辑,简单地定义了 GraphQL 查询和 REST 请求之间的转换,并且能够生成一个功能完善的 GraphQL 服务器,时间不超过五分钟。

    1.2K40

    与我一起学习微服务架构设计模式8—外部API模式

    公共层实现共享功能,边缘功能。 API Gateway的所有者模式 API Gateway若由一个单独团队维护,这种集中式的瓶颈与微服务架构理念背道而驰。...使用响应式编程抽象 按顺序调用服务,服务响应时间过长,尽可能同时调用所有服务,但编写可维护的并发代码存在挑战。可使用响应式方法,CompleteFutures、Monos、RxJava等。...实现API Gateway 实现支持多种客户端的REST API的API Gateway非常耗时,你可能需要考虑使用基于图形的API框架,GraphQL。...把模式连接到数据源GraphQL服务器执行查询时,必须从一个或多个数据存储检索所请求的数据。通过将解析函数附加到模式定义的对象类型字段,可以将GraphQL模式与数据源相关联。...为了让客户端调用GraphQL,你需要将它与Web框架集成,Express Web

    1.4K30

    我为什么要放弃RESTful,选择拥抱GraphQL

    客户端拓展功能时要不断编写新接口(依赖于服务端),GraphQL 中一个服务仅暴露一个 GraphQL 层,消除了服务器对数据格式的硬性规定,客户端按需请求数据,可进行单独维护和改进。...举个经典的例子:前端向后端请求一个book对象的数据及其作者信息。 我用动图来分别演示下RESTGraphQL是怎么样的一个过程。...Endpoints对比 REST API's Endpoints GraphQL 实际上将多个 HTTP 请求聚合成了一个请求,将多个 restful 请求的资源变成了一个从根资源 POST 访问其他资源的...GraphQL应用的基本架构 下图是一个 GraphQL 应用的基本架构,其中客户端只和 GraphQL 层进行 API 交互,而 GraphQL 层再往后接入各种数据源。...这样一来,只要是数据源有的数据, GraphQL 层都可以让客户端按需获取,不必专门再去定接口了。

    2.4K40

    为什么我劝你放弃了Restful API?

    客户端拓展功能时要不断编写新接口(依赖于服务端),GraphQL 中一个服务仅暴露一个 GraphQL 层,消除了服务器对数据格式的硬性规定,客户端按需请求数据,可进行单独维护和改进。...举个经典的例子:前端向后端请求一个book对象的数据及其作者信息。 我用动图来分别演示下RESTGraphQL是怎么样的一个过程。...先看REST API的做法: 再来看GraphQL是怎么做的: 可以看出其中的区别: 与REST多个endpoint不同,每一个的 GraphQL 服务其实对外只提供了一个用于调用内部接口的端点,所有的请求都访问这个暴露出来的唯一端点...GraphQL应用的基本架构 下图是一个 GraphQL 应用的基本架构,其中客户端只和 GraphQL 层进行 API 交互,而 GraphQL 层再往后接入各种数据源。...这样一来,只要是数据源有的数据, GraphQL 层都可以让客户端按需获取,不必专门再去定接口了。

    2.9K20

    API架构风格对比:SOAP vs REST vs GraphQL vs RPC

    现在,很多API用户放弃REST,并拥抱GraphQL。而在十年之前,对于REST来说则是相反的情况,在于SOAP的竞争REST大获全胜。...现在,GraphQL生态扩展了相关的库,并出现了很多强大的工具,Apollo, GraphiQL, and GraphQL Explorer。...GraphQL如何工作 一开始,GraphQL会创建一个schema(模式),它描述了在一个GraphQL API的所有请求以及这些请求返回的所有types。...REST提供了多种API版本,而GraphQL是一种单一的、演化的版本,可以持续访问新的特性,方便服务端代码的维护。...而REST架构不能部分展示数据(要么全部显示,要么全部隐藏)。 GraphQL 的缺点 性能问题:GraphQL用复杂度换来功能上的提升。在一个请求包含太多封装的字段可能会导致系统过载。

    3K11

    GraphQL详解

    客户端拓展功能时要不断编写新接口(依赖于服务端),GraphQL 中一个服务仅暴露一个 GraphQL 层,消除了服务器对数据格式的硬性规定,客户端按需请求数据,可进行单独维护和改进。...举个经典的例子:前端向后端请求一个book对象的数据及其作者信息。 我用动图来分别演示下RESTGraphQL是怎么样的一个过程。...Endpoints对比 REST API's Endpoints GraphQL 实际上将多个 HTTP 请求聚合成了一个请求,将多个 restful 请求的资源变成了一个从根资源 POST 访问其他资源的...GraphQL应用的基本架构 下图是一个 GraphQL 应用的基本架构,其中客户端只和 GraphQL 层进行 API 交互,而 GraphQL 层再往后接入各种数据源。...这样一来,只要是数据源有的数据, GraphQL 层都可以让客户端按需获取,不必专门再去定接口了。

    2.6K00

    GraphQL

    它是由Facebook开发并开源的,现在由来自世界各地的公司和个人组成的大型社区维护。...客户端拓展功能时要不断编写新接口(依赖于服务端),GraphQL 中一个服务仅暴露一个 GraphQL 层,消除了服务器对数据格式的硬性规定,客户端按需请求数据,可进行单独维护和改进。...Endpoints对比 REST API's Endpoints GraphQL 实际上将多个 HTTP 请求聚合成了一个请求,将多个 restful 请求的资源变成了一个从根资源 POST 访问其他资源的...GraphQL应用的基本架构 下图是一个 GraphQL 应用的基本架构,其中客户端只和 GraphQL 层进行 API 交互,而 GraphQL 层再往后接入各种数据源。...这样一来,只要是数据源有的数据, GraphQL 层都可以让客户端按需获取,不必专门再去定接口了。

    2.6K65

    四种主流的API风格介绍与对比

    RESTful API 通过资源标识符和状态转移等概念,将客户端和服务器之间的关注点分离,从而提高了系统的解耦合和可维护性。 平台和语言。...GraphQL API 的优缺点 GraphQL API的优点: 高度定制化:GraphQL API允许客户端请求特定的数据,从而减少了不必要的数据传输,提高了性能。...单一的入口点:GraphQL API通过一个单一的入口点提供所有数据,这使得客户端更容易理解和使用API。这有助于简化客户端的开发和维护工作。...缺乏标准化:虽然REST API已经成为Web开发的事实标准,但GraphQL API仍然是一个相对较新的技术。这意味着它可能没有那么多现有的工具和资源可供开发人员使用。...六、对比分析 下表列出了四种主流的API风格在使用场景、数据格式和接口性能等方面的比较: API风格 使用场景 数据格式 接口性能 SOAP API 企业级应用、大规模数据请求与查询、平台应用 XML

    1.2K50

    架构师该如何为应用选择合适的API

    对于具体应用而言,更多是进程之间(本机),主机之间(本网络),服务之间(可能域广域网)的交互。...无状态:服务器不得存储与客户端请求相关的任何内容。客户端负责维护应用程序的状态。 可缓存的:资源必须可缓存。 分层系统:体系结构必须是分层的,这意味着体系结构的组件可以位于多个服务器。...在REST API建立在请求方法和端点之间的连接上的情况下,GraphQL API设计为仅使用一个始终通过POST请求查询的端点,通常使用URL yourdomain.com/graphql。...尽管GraphQL的安装成本可能会高于传统的REST架构,但更具可维护性的代码,强大的开发工具以及简化的客户端查询,这些都是不错的收益。...很难缓存,缓存API响应的目的主要是为了更快地从将来的请求获取响应。与GraphQL不同,RESTful API可以利用HTTP规范内置的缓存。

    1.6K20

    GraphQL 初体验,Node.js 构建 GraphQL API 指南

    在传统的基于 REST 的 API 方法,客户端发出请求,而服务端决定响应。 但是在 GraphQL ,客户端可以精确地确定其从服务器获取的数据。...让我们看一下如何在 Node.js 实现解析器。我们的目的是围绕着解析器如何与模式一起操作来巩固概念,所以我们不会围绕着如何设置数据存储来做太详细的介绍。...缓存 基于 REST 的 API 在缓存时不需要过度关注,因为它们可以构建在 Web 的其他部分使用现有 HTTP 头策略上。GraphQL 不具有这些缓存机制,这会对重复请求造成不必要的处理负担。...默认情况下,express-graphql 会将当前的 HTTP 请求作为上下文的值来传递,但在设置服务器时可以更改: app.use( '/graphql', express_graphql({...但这个缺点也是积极的:通过仔细设计你的 Graphql Schema,你可以避免在更容易实现(也更容易破坏)的 REST 端点中明显的陷阱,命名的不一致和混乱的关系。

    8.3K40

    基于场景选择微服务的API范式:RESTGraphQL、Webhooks和gRPC

    无论是否有上下文,意味着每一次REST请求都包含关于这个请求的全部信息而不依赖其他的环境信息。这也是无状态的含义之一。...GraphQL的一个巨大好处,是在默认情况下,它通常只发送最小请求,而REST通常发送完整请求(即默认同时发送它拥有的所有内容)。...实际上解答了很多现有文章对于RESTGraphQL的误解。 一般认为,REST的多端点特性需要进行API的组合以及多次HTTP请求才能完成GraphQL一次完成的查询。...当服务器发生了变化时,修改了资源的 URI,客户端也需要进行相应的修改。而使用 HATEOAS 的 REST 服务,客户端可以通过服务器提供的资源的表达来智能地发现可以执行的操作。...14、是否跨越有边界的上下文:是,转向2;不是,转向13; (REST请求带有自描述性,并且资源可以不依赖上下文关系而被理解和识别)

    2.6K30

    GraphQL学习第一篇 -GraphQL简介

    GraphQl 介绍 GraphQL 是一种新的 API 的查询语言,它提供了一种更高效、强大和灵活 API 查询。它 是由 Facebook 开发和开源,目前由来自世界各地的大公司和个人维护。...GraphQL 对API 的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余。...为什么推荐 GraphQL 而不是 RESTful API 在过去的十多年中,REST 已经成为设计 Web API的标准(虽然只是一个模糊的标准)。...如果设计的数据结构是从属的,直接就能在查询语句中指定,即使数据结构是独 立的,也可以在查询语句中指定上下文,只需要一次网络请求,就能获得资源和子资源的数据。 (4). 代码即是文档。...GraphQL 会把 schema 定义和相关的注释生成可视化的文档,从而使得代码的变更,直接就反映到最新的文档上,避免 RESTful 手工维护可能会造成代码、 文档不一致的问题。 (5).

    53130

    怎样使用 apollo-link-state 管理本地数据

    此外,GraphQL 有能力将对多个数据源请求集成在单次查询,在此我们将充分利用这个特性。 . 以上是 Apollo Client 的数据流架构图。...GraphQL 并不在乎请求是要发送给一个 gRPC 服务器,或是 REST 端点,又或是客户端缓存。GraphQL 是一门针对数据的通用语言,与数据的来源毫无关联。...GraphQL 最大的一个优势在于,当给 GraphQL 语句中的字段加上合适的 GraphQL 指令后,单条 query 就可以从多个数据源获取数据,无论本地还是远端。让我们来看看具体的方法。...然而,我们不建议在 resolver REST 端点发请求。...GraphQL 的一个很让人激动的功能是在单个 query 向多个数据源请求数据。

    2.4K100
    领券