GraphQL 入门: Apollo Client - 持久化GraphQL查询概要
1. 持久化查询的概念持久化查询,是一种避免客户端直接在查询请求中包含查询文档的一种方式,客户端只需要传递给要执行查询的ID,服务器通过ID查询到GraphQL文档,并在服务器端执行的过程. 优缺点: 客户端发送一个巨大的查询过量消耗服务器的资源 客户端可以执行任意查询,容易导致安全问题 使用持久化查询的目的:
从直接发送查询文档转换到持久化查询的效果: 发送一个巨大的查询不再是一个问题 客户端只能查询服务器支持的限制性的GraphQL查询(通过ID) 2. 要求客户端需要使用到 persistgraphql 工具来生成对应的查询描述文档. 用于完成查询到ID的映射关系. 服务器端也需要做同样的事情. 3. 实施方案本节描述了服务器端和客户端的具体实现. 3.1. 服务器端
3.1.1. 服务器端查询转换原理服务器接收到客户端发过来的查询如下: { id: < 查询 ID >,variables: < 变量JSON对象 >,} 通过查找ID,把查询转换为如下形式,把ID替换为查询文本: { query: < GraphQL文档 >,variables: < 变量JSON对象 > } 3.1.2. 实现细节创建一个文档Provider: defmodule MyApp.ExtractedQueryProvider do use Absinthe.Plug.DocumentProvider.Compiled provide File.read!("/path/to/extracted_queries.json") |> Poison.decode! |> Map.new(fn {k,v} -> {v,k} end) # invert key/value end 添加该文档 Provider 到 plug Absinthe.Plug,schema: MyApp.Schema,document_providers: [ Absinthe.Plug.DocumentProvider.Default,MyApp.ExtractedQueryProvider ] 当构建服务器端项目的时候,读取
3.2. 客户端本节描述了持久化查询的客户端实现. 3.2.1 基本原理客户端通过读取 这个 { < print(transform(GraphQL Document)) >: < ID >,}
最终,客户端通过下面的伪代码执行 GraphQL 查询: query(request: Request) { // 在 request.query 结构中查找对应的ID // 找到对应的ID // 通过GraphQL查询变量把ID传递给服务器 // 返回一个Promise对象用于获取服务器的返回结果 } 3.2.2 实现细节安装 npm install --save persistgraphql # 或 yarn add persistgraphql # 全局安装 yarn global add persistgraphql
persistgraphql queries.graphql 生成 git clone git@github.com:apollographql/GitHunt-React.git cd GitHunt-React persistgraphql ui/graphql extracted_queries.json 客户的实现方法可参考资料: 使用Apollo Client持久化GraphQL查询 4. 参考资料
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |