关于使用Apollo Client useQuery React Hook发送GET请求的技术疑问
嘿,这个问题其实涉及到GraphQL的通用实践和Apollo Client的配置逻辑,咱们一步步拆解清楚:
先搞清楚核心背景
首先,GraphQL服务的常规设计是接收POST请求——因为GET请求的URL长度有限,复杂的查询(比如带大量变量、多层嵌套字段的请求)很容易超出浏览器或服务器的URL长度限制,导致请求失败。而POST请求把查询体放在请求正文中,没有这个限制,也更适合处理带变量的GraphQL查询。
但这不是说GraphQL不能用GET,只是生态里默认用POST而已。现在回到你的问题,分两种场景给你建议:
场景1:你的后端是GraphQL服务
优先建议:调整后端支持POST请求
如果可以修改后端,我强烈建议你把GET_ALL_MODELS对应的GraphQL端点改成支持POST(最好同时兼容GET和POST)。这是行业通用的做法,后续不管是用Apollo Client还是其他GraphQL工具(比如GraphiQL),都不会有兼容问题,也能避免复杂查询时的URL长度问题。
特殊情况:后端必须只能用GET
如果因为架构限制,后端只能接收GET请求,那你可以在Apollo Client里配置,让useQuery发送GET请求。有两种配置方式:
- 全局配置(所有
useQuery都发GET):import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client'; const httpLink = createHttpLink({ uri: '/your-graphql-endpoint', fetchOptions: { method: 'GET', // 全局设置请求方法为GET }, }); const client = new ApolloClient({ link: httpLink, cache: new InMemoryCache(), }); - 单个查询配置(仅特定
useQuery发GET):const { loading, error, data } = useQuery(GET_ALL_MODELS_QUERY, { context: { fetchOptions: { method: 'GET', // 只为这个查询设置GET方法 }, }, });
场景2:你的后端是REST接口(不是GraphQL服务)
如果GET_ALL_MODELS是一个REST风格的GET接口,那其实用useQuery不是最适配的选择——毕竟useQuery是为GraphQL查询设计的。这种情况下,更建议你用普通的fetch/axios调用,或者用Apollo Client的REST Link来对接REST接口。
当然,如果一定要用useQuery,也可以通过上面的配置方式让它发送GET请求到REST端点,但这属于非常规用法,可能需要额外处理请求参数和响应解析,成本更高。
总结建议
- 如果是GraphQL服务:优先改后端支持POST,这是长期来看最稳妥的方案;
- 如果后端无法修改:再在前端Apollo Client里配置发送GET请求;
- 如果是REST接口:换用更适配的工具调用,而非强行用
useQuery。
内容的提问来源于stack exchange,提问作者YellowGuy

