繁体   English   中英

GraphQL Apollo iOS 客户端响应标头

[英]GraphQL Apollo iOS Client Response Headers

我正在使用 Apollo iOS 客户端进行 GraphQL 查询。 我需要在标头中传递 Auth 令牌,我可以使用以下代码实现 -

let apolloAuth: ApolloClient = {
            let configuration = URLSessionConfiguration.default
            let token = "Bearer \(UserDefaults.standard.string(forKey: "UserToken") ?? "")"
            // Add additional headers as needed
            configuration.httpAdditionalHeaders = ["Authorization": token]

            let url = URL(string: "...URL.../graphql")!

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

我的获取查询如下 -

apolloAuth.fetch(query: referralQuery){ (result, error) in

        if let error = error {
            print(error.localizedDescription)
            return
        }else{
            self.referralId = result?.data?.referrals?.id
        }

    }

现在我的服务器在作为响应标头的一部分的每个请求之后返回一个刷新的身份验证令牌。 我需要从响应标头中获取令牌,但我无法找到一种方法来做到这一点。 有人可以指导我吗?

URLSessionConfiguration对象附带共享的HTTPCookieStorage单例对象。 使用该配置设置apollo客户端后,您可以使用服务器将身份验证令牌存储在cookie中,然后在每次请求时将cookie发送到客户端。 自动,您将能够像这样访问该cookie:

apollo.fetch(query: GraphQLQuery()) { result, error in
        if let error = error { fatalError(error.localizedDescription) }
        if let data = result?.data {
          // do something with data
        }
        self.getCookies()
      }

func getCookies() {
    let cookies = HTTPCookieStorage.shared.cookies
    if let c = cookies {
      print(c)
      // if your server sent a token inside a cookie, you will see it here
    }
  }

使用拦截器<\/strong><\/em>从响应标头中读取令牌。

示例代码:

class UserManagementInterceptor: ApolloInterceptor {

    /// Helper function to add the token then move on to the next step
    private func addTokenAndProceed<Operation: GraphQLOperation>(
        to request: HTTPRequest<Operation>,
        chain: RequestChain,
        response: HTTPResponse<Operation>?,
        completion: @escaping (Result<GraphQLResult<Operation.Data>, Error>) -> Void) {
            
            if let headerFields = response?.httpResponse.allHeaderFields {
                // Read the required tokens
            }
            
            chain.proceedAsync(request: request,
                               response: response,
                               completion: completion)
        }
    
    func interceptAsync<Operation: GraphQLOperation>(
        chain: RequestChain,
        request: HTTPRequest<Operation>,
        response: HTTPResponse<Operation>?,
        completion: @escaping (Result<GraphQLResult<Operation.Data>, Error>) -> Void) {
        addTokenAndProceed(to: request,
                           chain: chain,
                           response: response,
                           completion: completion)
        
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM