Как реализовать подписку на GraphQL с помощью клиента Apollo IOS

Я пытаюсь реализовать подписку Graphql с помощью клиента Apollo IOS. Но не в состоянии понять это как отсутствие примеров документации. Пример, приведенный в документации apollo:

let apollo: ApolloClient = {
  let configuration = URLSessionConfiguration.default
  // Add additional headers as needed
  configuration.httpAdditionalHeaders = ["Authorization": "Bearer <token>"] // Replace `<token>`

  let url = URL(string: "http://localhost:8080/graphql")!

  return ApolloClient(networkTransport: HTTPNetworkTransport(url: url, configuration: configuration))
}()

APOLLO IOS GUIDE: создание клиента

3 ответа

Решение

Реализуйте подписку в клиенте apollo ios graphql, выполнив следующие действия.

  1. Используя cocoapods:

    1. pod 'Apollo'
    2. pod 'Apollo/WebSocket'
    3. pod install
  2. Создать клиент для поддержки подписки и аутентификации. Добавьте ниже код в AppDelegate.swift:

    1. Websocket - мы должны использовать WebSocketTransport а также URLRequest
    2. Аутентификация - мы должны передать параметры аутентификации в параметрах соединения connectingPayload на сервер. И для http мы передаем его в заголовках, как указано во фрагменте вопроса.
    3. SplitNetworkTransport - объединить оба http а также websocket создать клиента. мы должны использовать httpNetworkTransport а также webSocketNetworkTransport


lazy var apollo: ApolloClient = {
    let authPayloads = [
        "Authorization": "Bearer "
    ]
    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = authPayloads

let map: GraphQLMap = authPayloads 
let wsEndpointURL = URL(string: "ws://localhost:8080/subscriptions")!
let endpointURL = URL(string: "http://localhost:8080/api")!
let websocket = WebSocketTransport(request: URLRequest(url: wsEndpointURL), connectingPayload: map)
let splitNetworkTransport = SplitNetworkTransport(
    httpNetworkTransport: HTTPNetworkTransport(
        url: endpointURL,
        configuration: configuration
    ), 
    webSocketNetworkTransport: websocket
)
return ApolloClient(networkTransport: splitNetworkTransport)

}()

Вот моя настройка ApolloClient только для транспортного клиента сокета:

let connectingPayload = ["authToken": accessToken]
let urlRequest = URLRequest(url: baseURL)
let webSocketTransport = WebSocketTransport(request: urlRequest, sendOperationIdentifiers: false, connectingPayload: connectingPayload)

let apollo = ApolloClient(networkTransport: webSocketTransport)

Я подхожу ближе. Меня отклонили из-за отсутствия правильных заголовков в моем обновлении Websocket. В итоге мне пришлось установить их прямо на URLRequest объект.

    var apollo: ApolloClient? {
        let authHeaders = ["X-Hasura-Access-Key": "<my_Key>", "Content-Type": "application/json"]

        let configuration = URLSessionConfiguration.default
        // Add additional headers as needed
        configuration.httpAdditionalHeaders = authHeaders

        //The string to my graph QL Server run by Hasure on AWS RDS.
        let graphQLEndpoint = "http://<my_host>/v1alpha1/graphql"
        let graphQLSubscriptionEndpoint = "ws://<my_host>/v1alpha1/graphql"
        //Take my Ec2 Server string and make a URL for the graph QL and subscriptions
        guard let httpURL = URL(string: graphQLEndpoint), let webSocketURL = URL(string: graphQLSubscriptionEndpoint) else {
            return nil
        }

        let httpTransport = HTTPNetworkTransport(url: httpURL, configuration: configuration, sendOperationIdentifiers: false)

        var request = URLRequest(url: webSocketURL)

        request.setValue("<my_key>", forHTTPHeaderField: "X-Hasura-Access-Key")

        request.setValue("application/json", forHTTPHeaderField: "Content-Type")

        let webSocketTransport = WebSocketTransport(request: request, sendOperationIdentifiers: false, connectingPayload: nil)

        let splitTransport = SplitNetworkTransport(httpNetworkTransport: httpTransport, webSocketNetworkTransport: webSocketTransport)

        //Initalize the APolloClient with that URL.
        return ApolloClient(networkTransport: splitTransport)
    }

Обновление сработало после этого.

Другие вопросы по тегам