代码之家  ›  专栏  ›  技术社区  ›  Rajesh Ujade Rob Church

如何使用apollo ios客户端实现graphql订阅

  •  3
  • Rajesh Ujade Rob Church  · 技术社区  · 6 年前

    我正在尝试使用apollo ios客户端实现graphql订阅。但由于缺少文档示例而无法理解。 阿波罗文档中给出的示例如下:

    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: Creating a client

    3 回复  |  直到 6 年前
        1
  •  6
  •   Rajesh Ujade Rob Church    6 年前

    按照以下步骤在apollo ios graphql客户机中实现订阅。

    1. 使用椰子荚:

      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)
    

    }()

        2
  •  1
  •   Jon Vogel    6 年前

    我快到了。我的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)
        }
    

    之后升级成功了。

        3
  •  1
  •   Dylan Moore    6 年前

    以下是我的Apollo客户端设置,仅用于web套接字传输客户端:

    let connectingPayload = ["authToken": accessToken]
    let urlRequest = URLRequest(url: baseURL)
    let webSocketTransport = WebSocketTransport(request: urlRequest, sendOperationIdentifiers: false, connectingPayload: connectingPayload)
    
    let apollo = ApolloClient(networkTransport: webSocketTransport)
    
    推荐文章