Apollo GraphQL 标头在 iOS Swift 中总是失败
Posted
技术标签:
【中文标题】Apollo GraphQL 标头在 iOS Swift 中总是失败【英文标题】:Apollo GraphQL header always gives failure in iOS Swift 【发布时间】:2021-07-22 21:09:11 【问题描述】:我在我的 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,
request: HTTPRequest<Operation>,
response: HTTPResponse<Operation>?,
completion: @escaping (Result<GraphQLResult<Operation.Data>, Error>) -> Void)
request.addHeader(name: "X-Shopify-Access-Token", value: "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")
defer
chain.proceedAsync(request: request,
response: response,
completion: completion)
guard let receivedResponse = response else
chain.handleErrorAsync(ResponseLoggingError.notYetReceived,
request: request,
response: response,
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)")
【问题讨论】:
我也遇到过类似的问题。你有解决办法吗? 【参考方案1】:我看到了您最近对其他人的问题的评论,想知道您是否取得了任何成功?这是我找到您的评论的问题。
How to add header in Apollo GraphQL : ios
【讨论】:
请直接评论问题。 我尝试了@ChamathJeevan 给出的相同代码语法,但它对我不起作用,我不知道为什么。以上是关于Apollo GraphQL 标头在 iOS Swift 中总是失败的主要内容,如果未能解决你的问题,请参考以下文章
Apollo graphql 将标头设置为 authmiddleware 不起作用
如何将标头添加到 ionic 4 / Apollo GraphQL App