如何将apisix支持graphQL功能?
摘要:https:apisix.apache.orgblog20220302apisix-integration-graphql https:juejin.cnpost7072557615833677837?is_prel
https://apisix.apache.org/blog/2022/03/02/apisix-integration-graphql/
https://juejin.cn/post/7072557615833677837?is_preload=1&module_name=iOS_tt_url&share_token=5F541E05-B8E8-43A4-B76D-660A0461924C&tt_from=copy_link&upstream_biz=iOS_url&utm_campaign=client_share&utm_medium=toutiao_ios&utm_source=copy_link
https://learning.postman.com/docs/sending-requests/graphql/graphql-overview
GraphQL 是什么?
GraphQL 是一种用于 API 的查询语言和运行时,由 Facebook 于 2012 年内部开发并于 2015 年公开。它的核心作用是为客户端提供一种精确、灵活且高效的方式来从服务端获取所需的数据。
一、GraphQL 是什么?
你可以将 GraphQL 理解为客户端与服务器之间的一种“对话协议”。客户端通过它向服务器发送一份结构化的“数据需求清单”(即查询语句),服务器则严格按照这份清单的格式和要求,返回恰好满足需求的数据,不多不少。
这与您更熟悉的 REST API 形成鲜明对比。在 REST 中,客户端通过访问不同的 URL 端点(如 /users 或 /posts)来获取数据,而每个端点返回的数据结构是固定的。GraphQL 则通常只有一个端点(如 /graphql),客户端通过改变查询语句的内容来决定具体要什么。
二、GraphQL 的核心作用与优势
其作用主要体现在解决传统 API(如 REST)在复杂应用场景下面临的几个关键痛点:
精准获取,避免“过度获取”与“获取不足”
问题:在 REST 中,请求一个用户信息端点 /users/123 可能会返回该用户的所有字段(如姓名、邮箱、地址、好友列表等),即使客户端只需要姓名。反之,如果需要展示一个博客文章及其作者信息,可能需要先调用 /posts/456,再根据返回的作者ID去调用 /users/789,产生多次往返请求(获取不足)。
GraphQL 解决方案:客户端在查询中明确指定所需的字段。只需要文章标题和作者姓名?查询就只写这两个字段。服务器一次性返回这些精确的数据,避免了不必要的数据传输,也减少了请求次数。
单一端点,强大的类型系统
问题:REST API 的端点随着业务增长而膨胀(/users, /posts, /comments, /users/{id}/posts 等),难以维护和让前端开发者全面了解。
GraphQL 解决方案:只有一个端点。所有可用的数据和操作(查询、变更)都通过一个严格的模式 来定义。这个模式像一份强类型的“合同”或“说明书”,明确列出了所有可查询的对象、字段、参数及其数据类型。前端开发者可以通过工具(如 GraphiQL)直观地浏览和测试所有能力。
灵活适应快速迭代的前端需求
问题:移动端、Web 端、桌面端可能需要同一数据的不同视图。为每个视图创建或修改 REST 端点会拖慢前后端开发效率。
GraphQL 解决方案:前端掌握数据需求的主动权。当 UI 组件需要新字段时,前端开发者只需在查询中添加该字段,无需后端专门为此修改 API 或创建新版本。这极大地提升了产品迭代速度。
三、一个简单类比
想象一下去餐厅点餐:
REST 方式:就像点固定套餐。点“A套餐”,你会得到开胃菜、主菜、甜点和饮料(可能包含你不喜欢的)。
GraphQL 方式:就像单点。你拿到一张完整的菜单(Schema),然后精确地写下:“我要一份牛排(查询),要五分熟(参数),并且只搭配薯条,不要沙拉(选择字段)”。厨房(服务器)会严格按照你的单子准备。
四、核心概念与工作原理
查询:用于获取数据的只读操作。# 客户端发送的查询
query {
user(id: "123") {
name
email
posts(limit: 2) { # 嵌套查询
title
}
}
}
变更:用于修改数据(增、删、改)的操作,语法类似查询。
