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文件:
- 打开可以正常访问的本地GraphiQL页面,执行GraphQL标准内省查询,将返回的完整结果保存为
graphql.schema.json放在项目根目录 - 修改
codegen.yml的schema字段指向本地文件:
schema: "./graphql.schema.json"
- 后续后端schema更新时,重新导出一次schema文件覆盖即可。
补充说明
如果配置POST后出现403错误,是Django默认的CSRF防护拦截了无状态的内省请求,可以在schema配置中追加自定义请求头携带CSRF凭证,或者临时给本地开发环境的GraphQL接口关闭CSRF校验即可。
内容的提问来源于stack exchange,提问作者sebtheiler
相关产品推荐
相关产品推荐

