将 Apollo iOS 客户端 GraphQL 查询变量和 URL 记录到控制台?

问题描述

我想在调用查询时将 Apollo iOS 客户端 GraphQL 查询的 url 打印到 Xcode 控制台。

解决方法

我不知道如何将所有 Apollo url 调用打印到控制台,但是通过扩展 GraphQLQuery,我可以访问操作名称、操作 ID 和变量,我可以使用它们来构建 url。我还打印出查询的操作名称和变量。

<form method="POST" action="{{ object.remove_url }}">

用法:

extension GraphQLQuery {

    func printInfo() {
    
        if let variables = self.variables?.JSONString {
        
            let cleanedVariables = variables.replacingOccurrences(of: "\\",with: "")
            print("GraphQL Query: \(self.operationName) \(variables))")
        
            if let operationID = self.operationIdentifier {
                            
                let url = "\(GraphQLClient.shared.url)?extensions={\"persistedQuery\":{\"sha256Hash\":\"\(operationID)\",\"version\":1}}&id=\(operationID)&operationName=\(self.operationName)&variables=\(cleanedVariables)"
                print("GraphQL URL",url)
            }
        
        } else {
            print("GraphQL Query: \(self.operationName)")

            if let operationID = self.operationIdentifier {
                            
                let url = "\(GraphQLClient.shared.url)?extensions={\"persistedQuery\":{\"sha256Hash\":\"\(operationID)\",\"version\":1}}&id=\(operationID)&operationName=\(self.operationName)"
                print("GraphQL URL",url)
            }
        }
    }
}

示例输出:

let standingsQuery = GetStandingsForSportQuery(sportID: sportIDInt,season: season)
standingsQuery.printInfo()

本示例中的 url 格式可能不典型,因为我们使用的是持久化查询。我使用 Charles 代理查看发送的实际 url,因此我知道格式。

您还可以扩展 GraphQLOperation 而不是 GraphQLQuery 来获取相同的信息,这也将支持突变和订阅。

,

您无需编写 swift 代码来提取 QueryName。

使用 Proxyman,就像 Charles Proxy。默认情况下,它会在列上显示 QueryName。

参考:https://docs.proxyman.io/advanced-features/graphql

GraphQL QueryName with Proxyman