graphql-spring-boot-starter如何配置WebSocket支持执行Query与Mutation
解决方案
你不需要自行开发额外的WebSocket端点覆盖默认的/graphql路径,你用的com.graphql-java-kickstart:graphql-spring-boot-starter:12.0.0版本自带的WebSocket实现本身就已经支持在同一条WebSocket连接上执行Query、Mutation、Subscription三类操作,你之前的报错是因为自定义Handler覆盖了原生的协议处理逻辑,导致请求没有按GraphQL WebSocket协议解析,才出现空查询报错。
操作步骤
- 先删除你之前自定义的覆盖
/graphql端点的HandlerMapping代码,保留框架原生的WebSocket配置。 - 检查项目配置文件,确认WebSocket开关已打开,路径和你要使用的
/graphql保持一致:
graphql: websocket: enabled: true path: /graphql # 支持的GraphQL WebSocket协议,默认已包含以下两类 protocols: - graphql-transport-ws - subscriptions-transport-ws
- 客户端调用时直接遵循GraphQL WebSocket协议发送请求即可,不需要区分操作类型:
- 首先建立WebSocket连接,指定使用的协议为
graphql-transport-ws - 连接建立后先发送初始化消息
- 后续Query、Mutation、Subscription都使用相同的请求格式发送即可,框架会自动识别操作类型,调用你定义的
GraphQLQueryResolver、GraphQLMutationResolver、GraphQLSubscriptionResolver执行对应逻辑,不需要你手动做Resolver关联。
调用示例(以wscat测试工具为例)
建立连接:
wscat -c ws://localhost:8080/graphql -p graphql-transport-ws
发送初始化消息:
{"type":"connection_init","payload":{}}
发送Query请求:
{"id":"test-query-1","type":"subscribe","payload":{"query":"query { listUser { id name } }"}}
发送Mutation请求:
{"id":"test-mutation-1","type":"subscribe","payload":{"query":"mutation { createUser(name: \"测试用户\") { id name } }"}}
执行完成后框架会自动返回对应结果,和HTTP调用的返回格式完全一致。
如果你确实需要自定义WebSocket的处理逻辑,不要完全替换原生的Handler,直接扩展框架自带的GraphQLWebsocketHandler织入你的自定义逻辑即可,避免重复实现整套GraphQL协议解析、执行逻辑。
内容的提问来源于stack exchange,提问作者Del Pedro
相关产品推荐
相关产品推荐

