如何解决Apollo GraphQL 标头总是在 iOS Swift 中失败
我第一次在我的 swift 项目中使用 Apollo GraphQL 客户端。遵循他们文档中提到的所有步骤,并通过谷歌搜索我的问题,但没有运气。我已经通过在我的请求 URL 中传递一个标头来提出一个查询请求,但它总是给我一个错误消息,比如 failure(Apollo.LegacyParsingInterceptor.LegacyParsingError.CouldNotParsetoLegacyJSON(data: 1839 bytes))。我已经提到了 link 的答案,但这对我不起作用。任何帮助将不胜感激。
导入 UIKit
导入阿波罗
class Network {
static let shared = Network()
private(set) lazy var apollo: ApolloClient = {
let cache = InMemorynormalizedCache()
let store1 = ApolloStore(cache: cache)
let client1 = URLSessionClient()
let provider = NetworkInterceptorProvider(store: store1,client: client1)
let url = URL(string:"https://Storename.myshopify.com/admin/api/2021-04/graphql")!
let requestChainTransport = RequestChainNetworkTransport(interceptorProvider: provider,endpointURL: url)
return ApolloClient(networkTransport: requestChainTransport,store: store1)
}()}
class RequestOrderDetailInterceptor: ApolloInterceptor {
func interceptAsync<Operation: GraphQLOperation>(
chain: RequestChain,request: HTTPRequest<Operation>,response: HTTPResponse<Operation>?,completion: @escaping (Result<GraphQLResult<Operation.Data>,Error>) -> Void) {
request.addHeader(name: "X-Shopify-Access-Token",value: "MyToken")
print( "Outgoing request: \(request)")
chain.proceedAsync(request: request,response: response,completion: completion)
}
}
class ResponSEOrderDetailInterceptor: ApolloInterceptor {
enum ResponseLoggingError: Error {
case notYetReceived
}
func interceptAsync<Operation: GraphQLOperation>(
chain: RequestChain,Error>) -> Void) {
request.addHeader(name: "X-Shopify-Access-Token",value: "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")
defer {
chain.proceedAsync(request: request,completion: completion)
}
guard let receivedResponse = response else {
chain.handleErrorAsync(ResponseLoggingError.notYetReceived,request: request,completion: completion)
return
}
print("HTTP Response: \(receivedResponse.httpResponse)")
if let stringData = String(bytes: receivedResponse.rawData,encoding: .utf8) {
print("Data: \(stringData)")
} else {
print("Could not convert data to string!")
}
}
}
struct NetworkInterceptorProvider: InterceptorProvider {
// These properties will remain the same throughout the life of the `InterceptorProvider`,even though they
// will be handed to different interceptors.
private let store: ApolloStore
private let client: URLSessionClient
init(store: ApolloStore,client: URLSessionClient) {
self.store = store
self.client = client
}
func interceptors<Operation: GraphQLOperation>(for operation: Operation) -> [ApolloInterceptor] {
return [
MaxRetryInterceptor(),LegacyCacheReadInterceptor(store: self.store),RequestOrderDetailInterceptor(),NetworkFetchInterceptor(client: self.client),ResponSEOrderDetailInterceptor(),ResponseCodeInterceptor(),LegacyParsingInterceptor(cacheKeyForObject: self.store.cacheKeyForObject),AutomaticPersistedQueryInterceptor(),LegacyCacheWriteInterceptor(store: self.store)
]
}
}
//这里我使用我的 apollo 客户端来获取记录
func getorderDetails(){
Network.shared.apollo.fetch(query: OrderDetailsByIdQuery(id: GraphQL.ID(rawValue: "Z2lkOi8vc2hvcGlmeS9PcmRlci8zNzcxODAxNjk4NDY5P2tleT1kNGRiMmVhODFlNGVlNzg1NzhhMDQ4ODI2Mzc4ZTkxMw==").rawValue)) { result in
print(result)
switch result {
case .success(let graphQLResult):
print("Oreder Details:",graphQLResult.data?)
case .failure(let error):
print("Error loading data \(error.localizedDescription)")
}
}
}
解决方法
我看到你最近对别人的问题发表的评论,只是想知道你是否取得了任何成功?这是我发现您评论的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。