I am working with the Apollo GraphQL client for the first time in my swift project. Followed all the steps mentioned in their document and searched over google for my issue but had no luck. I have made a query request by passing a header in my request URL but it always gives me a failure with error msg like failure(Apollo.LegacyParsingInterceptor.LegacyParsingError.couldNotParseToLegacyJSON(data: 1839 bytes)). I have referred answer of link but this is not worked for me. Any Help will be most appreciated.
import UIKit
import Apollo
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)
]
}
}
//Here I am using my apollo client to fetch records
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)")
}
}
}