Apollo Kotlin中的订阅
- WebSocket,
- subscriptions-transport-ws (⚠️ 未经维护!)
- graphql-ws
- appsync(也使用
graphql-ws
作为Sec-WebSocket-Protocol)
- HTTP,使用分块的多部分响应
您必须使用您的GraphQL端点支持的任何传输方式。
您在应用中定义订阅与定义查询类似,除了您使用subscription
关键字。以下是一个订阅示例,用于获取每当数字增加时该数字的最新值:
subscription NumberIncremented {numberIncremented}
与查询和变异操作不同,订阅操作只能包含一个 字段,这里的字段指的是Subscription
类型的字段。要订阅多个字段,需要创建多个订阅操作。
配置WebSocket订阅
默认情况下,Apollo Kotlin使用subscriptions-transport-ws
协议来通过订阅进行交互,这是通过SubscriptionWsProtocol
类实现的。该协议现已不再积极维护。它目前保留为默认选项以实现向后兼容。
Apollo Kotlin的将来的版本将默认使用更新后的graphql-ws
协议和GraphQLWsProtocol
类。如果你的服务器已经使用graphql-ws
,请确保设置你的WsProtocol为GraphQLWsProtocol
。
要使用WebSocket进行订阅,使用WebSocketNetworkTransport
:
val apolloClient = ApolloClient.Builder().subscriptionNetworkTransport(WebSocketNetworkTransport.Builder().serverUrl("https://apollo-fullstack-tutorial.herokuapp.com/graphql").build()).build()
注意: Apollo Kotlin支持https://
(或http://
)和wss://
(或ws://
)协议。内部,wss://
会被重命名为https://
,你使用哪个协议并无区别。
定制你的WebSocket协议
默认情况下,Apollo Kotlin使用subscriptions-transport-ws协议以确保向后兼容,但它支持以下所有WebSocket子协议:
- subscriptions-transport-ws (⚠️ 不再积极维护!)
- graphql-ws
- appsync (同样使用
graphql-ws
作为 Sec-WebSocket-Protocol)
要自定义协议,请使用 WsProtocol
接口。 Apollo Kotlin 内置了对上述子协议的支持:
子协议 | 类 |
---|---|
subscriptions-transport-ws | SubscriptionWsProtocol (默认) |
graphql-ws | GraphQLWsProtocol |
appsync | AppSyncWsProtocol |
例如,您可以这样配置一个 graphql-ws
传输:
val apolloClient = ApolloClient.Builder().subscriptionNetworkTransport(WebSocketNetworkTransport.Builder().protocol(GraphQLWsProtocol.Factory()).serverUrl("https://apollo-fullstack-tutorial.herokuapp.com/graphql").build()).build()
身份验证
有关使用 WebSocket 进行身份验证的说明,请参阅 本部分。
配置 HTTP 订阅
要使用 HTTP 进行 订阅,请使用 HttpNetworkTransport
,如下所示:
val apolloClient = ApolloClient.Builder().subscriptionNetworkTransport(HttpNetworkTransport.Builder().serverUrl("https://apollo-fullstack-tutorial.herokuapp.com/graphql").build()).build()
这是所需的唯一配置。 HttpNetworkTransport
将使用 分块多部分响应来处理 订阅 操作,以及标准 POST 或 GET 请求来查询和 突变。
监听订阅
在配置了 NetworkTransport
之后,使用 ApolloClient.subscribe
来打开连接并监听更改:
apolloClient.subscription(TripsBookedSubscription()).toFlow().collect {println("trips booked: ${it.data?.tripsBooked}")}
由于 订阅 是长时间运行的 操作,它们返回一个 Flow<Response>
而不是单个 Response
。
终止订阅
终止通过协程作用域处理。取消协程以终止 订阅。
默认情况下,所有活动的 订阅 之间共享单个 WebSocket。在没有活动订阅时,WebSocket 在可配置的超时后关闭。
错误处理
与查询一样, 订阅 支持使用 GraphQL 错误的局部响应,这些错误在 Flow
中发出。
网络错误会终止流
,并需要重试以获取新的更新。根据情况,重试可能会打开新的 WebSocket 或重启订阅。
另请参阅本部分关于处理 WebSocket 错误。