GraphQL请求通过POST发送JSON,统一fetch入口需规范query/variables/operationName组装、统一错误处理,并支持认证、中止、钩子等扩展能力。

GraphQL 请求本质上是通过 POST 方法发送 JSON 数据到服务端,因此设计一个统一的 fetch 入口函数,核心在于规范请求体(query、variables、operationName)的组装与错误处理,同时保持对不同业务场景的灵活性。
封装基础 fetch 调用
避免每次调用都手动构造 fetch 选项,把通用配置(如 endpoint、headers、credentials)抽离出来:
- 默认使用 /graphql 作为 endpoint,支持传参覆盖
- 固定设置 Content-Type: application/json
- 自动携带认证 token(如从 localStorage 或 context 获取)
- 统一开启 credentials: 'include'(适配带 Cookie 的鉴权)
标准化请求体结构
GraphQL POST 体必须是 JSON 对象,字段需符合规范:
- query:必填,字符串格式的 GraphQL 操作(支持 query/mutation/subscription 字符串)
- variables:可选,键值对对象,对应 query 中的 $var 占位符
- operationName:可选,当 query 包含多个命名操作时,用于指定执行哪一个
入口函数应接受这三项为参数,并原样透传进 body,不擅自转换或校验 query 语法(那是服务端或开发时工具的事)。
统一响应解析与错误处理
GraphQL 响应体结构固定:{"data": {...}, "errors": [...]}。入口函数应:
- 检查 HTTP 状态码非 2xx 时抛出网络错误
- 解析 JSON 后,若 errors 存在且非空,合并为一个结构化错误(如
new GraphQLError(errors))并 reject - 仅当 data 存在且无 errors 时 resolve(data),保持前端消费简洁
- 可选:对特定 error.extensions.code 做分类处理(如 UNAUTHENTICATED → 触发登出)
支持请求复用与轻量扩展
为适配 Hook、中台组件等场景,可提供:
- 返回 Promise 的基础函数(
graphqlFetch(query, vars?, opts?)) - 配套的 React Hook 封装(
useGraphql(query, vars, options)),内置 loading/error/data 状态 - 支持 abortController.signal 传入,便于取消请求
- 预留 middleware 钩子(如 beforeFetch、afterResponse),用于日志、埋点或 mock 注入
不强制依赖 Apollo Client,专注协议层抽象,让团队可自由选择上层方案。










