Apollo GraphQL header always gives failure in iOS Swift

2k views Asked by At

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)")
        }
    }

}

1

There are 1 answers

2
KingD On

I saw your recent comment on someone else's issue and just wondering if you've had any success? Here's the issue where I found your comment.

How to add header in Apollo GraphQL : iOS