You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GraphQL Code Generator加载本地schema报GET/HEAD不能携带请求体错误

问题根因

报错核心是Request with GET/HEAD method cannot have body,和后端服务可用性无关:

  • 本地GraphiQL能正常访问,是因为GraphiQL默认使用POST方法携带GraphQL查询体请求接口,符合HTTP规范
  • GraphQL Code Generator依赖的@graphql-tools/url-loader拉取远程schema做内省时,默认优先尝试GET请求,但它底层用的undici fetch实现严格遵循HTTP规范,禁止GET/HEAD请求携带请求体,而内省查询必须放在请求体中传输,直接在请求构造阶段就抛出了错误,根本没发到后端。
解决方法

方案1(推荐,一劳永逸)

修改codegen.yml配置,强制内省请求使用POST方法,把原来直接写URL的schema字段改成带配置的对象形式:

overwrite: true
schema:
  - http://localhost:8000/graphql:
      method: POST
documents: "src/**/*.graphql"
generates:
  src/generated/graphql.ts:
    plugins:
      - "typescript"
      - "typescript-operations"
  ./graphql.schema.json:
    plugins:
      - "introspection"

改完重新执行yarn graphql-codegen即可正常加载schema。

方案2(绕开远程拉取,适合有鉴权/接口不稳定场景)

如果配置POST后仍有问题,可以直接使用本地schema文件:

  1. 打开可以正常访问的本地GraphiQL页面,执行GraphQL标准内省查询,将返回的完整结果保存为graphql.schema.json放在项目根目录
  2. 修改codegen.yml的schema字段指向本地文件:
schema: "./graphql.schema.json"
  1. 后续后端schema更新时,重新导出一次schema文件覆盖即可。
补充说明

如果配置POST后出现403错误,是Django默认的CSRF防护拦截了无状态的内省请求,可以在schema配置中追加自定义请求头携带CSRF凭证,或者临时给本地开发环境的GraphQL接口关闭CSRF校验即可。

内容的提问来源于stack exchange,提问作者sebtheiler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:54:27