"error": "无法连接到 websocket 端点 ws://localhost:8000/subscriptions。请检查端点 url 是不是正确。"

Posted

技术标签:

【中文标题】"error": "无法连接到 websocket 端点 ws://localhost:8000/subscriptions。请检查端点 url 是不是正确。"对于graphql spqr【英文标题】:"error": "Could not connect to websocket endpoint ws://localhost:8000/subscriptions. Please check if the endpoint url is correct." for graphql spqr"error": "无法连接到 websocket 端点 ws://localhost:8000/subscriptions。请检查端点 url 是否正确。"对于graphql spqr 【发布时间】:2021-10-25 16:21:13 【问题描述】:

我的数据存储在 mongodb 中,我正在尝试使用 graphql spqr 和项目响应式来实现订阅。 当我尝试测试突变和查询时,我得到了响应,但我不断收到以下关于 subsctiptions 的错误消息:

"error": "无法连接到 websocket 端点 ws://localhost:8080/订阅。请检查端点 url 是否为 正确。”

我已经对此问题进行了一些研究并遇到了this,包括我的依赖项中的“spring-boot-starter-websocket”并没有解决这个问题,而且我没有使用 firefox 作为我的浏览器游乐场 gui。

我按照this 示例介绍了如何使用 graphql spqr 实现订阅,当我尝试克隆项目时,订阅实际上工作得很好。

我的实现与上面的项目没有任何区别...... 这是我的 build.gradle 文件:

    configurations 

    compile.exclude module: 'spring-boot-starter-tomcat'
    compile.exclude group: 'org.apache.tomcat'

    compileOnly 
        extendsFrom annotationProcessor
    


dependencies 

   
    // https://mvnrepository.com/artifact/de.flapdoodle.embed/de.flapdoodle.embed.mongo
    testImplementation group: 'de.flapdoodle.embed', name: 'de.flapdoodle.embed.mongo', version: '3.0.0'

    // https://mvnrepository.com/artifact/io.leangen.graphql/graphql-spqr-spring-boot-starter
    implementation group: 'io.leangen.graphql', name: 'graphql-spqr-spring-boot-starter', version: '0.0.6'

    implementation group: 'io.leangen.graphql', name: 'spqr', version: io_leangen_graphql_spqr

    // https://mvnrepository.com/artifact/com.graphql-java-kickstart/playground-spring-boot-starter
    implementation group: 'com.graphql-java-kickstart', name: 'playground-spring-boot-starter', version: '11.1.0'

    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-websocket
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-websocket', version: '2.5.4'


    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb-reactive
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-mongodb-reactive', version: '2.5.4'

    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '2.5.4'

    compileOnly group: 'org.projectlombok', name: 'lombok', version: org_projectlombok_lombok_version
    annotationProcessor group: 'org.projectlombok', name: 'lombok', version: org_projectlombok_lombok_version

我正在使用

compile.exclude module: 'spring-boot-starter-tomcat'
    compile.exclude group: 'org.apache.tomcat'

启动netty而不是tomcat

这是我的订阅实现:

@Autowired
private ProductRepository productRepository;

private final ConcurrentMultiMap<Double, FluxSink<ProductDto>> subscribers = new ConcurrentMultiMap<>();

@GraphQLQuery
public Flux<ProductDto> getProducts()
    return productRepository.findAll().map(AppUtils::ProductEntityToDto);


@GraphQLSubscription
public Publisher<ProductDto> taskStatusChanged(double price) 
    return Flux.create(subscriber -> subscribers.add(price, subscriber.onDispose(() -> subscribers.remove(price, subscriber))), FluxSink.OverflowStrategy.LATEST);

我的代码中是否缺少某些内容?还是依赖?还是其他配置?任何帮助将不胜感激...

【问题讨论】:

【参考方案1】:

默认情况下,GraphQl SPQR 似乎将 WebSocket 订阅处理端点映射到 /graphql,而不是其他 GraphQL 框架中的一般 /subscriptions

应用程序启动时在控制台中查看以下信息。

2021-10-09 12:50:02.653 DEBUG 14632 --- [    Test worker] o.s.w.s.s.s.WebSocketHandlerMapping      : Patterns [/graphql] in 'webSocketHandlerMapping'

可以通过在您的 application.properties 中自定义 graphql.spqr.ws.endpoint 属性来更改它。

但它的 GraphQL WebSocket 订阅实现似乎很混乱,它没有遵循 Appllo WebSocket 订阅协议或新的graphql-ws 规范。

【讨论】:

以上是关于"error": "无法连接到 websocket 端点 ws://localhost:8000/subscriptions。请检查端点 url 是不是正确。"的主要内容,如果未能解决你的问题,请参考以下文章

验证测试用户 "error_type": "OAuthException", "code": 400, "error_messa

Spotify 白名单 URI 仍然返回 "error": "invalid_grant", "error_description": &

在创建 keycloak 用户时收到带有 "error":"unknown_error" 消息的 403 错误

如何从 Swift 中的 error.userInfo 获取 ["error"]["type"]?

收到错误 "errors":["message":"必须提供查询字符串。"]

Spring oauth2 中的 error="invalid_grant", error_description="Bad credentials"