我们如何调试/查看通过Moya通过API设置的请求?

时间:2019-01-09 08:03:13

标签: ios swift moya

我们如何调试设置到后端服务器的请求?

我希望能够准确查看或打印出带有标头参数的完整请求,等等...每当我通过Moya发出任何请求时,该请求就会被发送到服务器上

6 个答案:

答案 0 :(得分:6)

如果从14开始使用Moya,则可以制作自己的详细插件,如下所示:

struct VerbosePlugin: PluginType {
    let verbose: Bool

    func prepare(_ request: URLRequest, target: TargetType) -> URLRequest {
        #if DEBUG
        if let body = request.httpBody,
           let str = String(data: body, encoding: .utf8) {
            print("request to send: \(str))")
        }
        #endif
        return request
    }
}

并使用:let provider = MoyaProvider<AuthService>(plugins: [VerbosePlugin(verbose: true)])

答案 1 :(得分:4)

从Moya 14.0开始,您需要执行以下操作:

let loggerConfig = NetworkLoggerPlugin.Configuration(logOptions: .verbose)
let networkLogger = NetworkLoggerPlugin(configuration: loggerConfig)    
let provider = MoyaProvider<YourAPI>(plugins: [networkLogger])

答案 2 :(得分:2)

通过激活Moya已经拥有的插件来完成。是NetworkLoggerPlugin。我需要更改以下代码行:

var provider = MoyaProvider<MainAPI>()

具有:

var provider = MoyaProvider<MainAPI>(plugins: [NetworkLoggerPlugin(verbose: true)])

感谢@ Anbu.Karthik

答案 3 :(得分:0)

  1. 使用它来设置提供者let provider: MoyaProvider<API> = MoyaProvider<API>(plugins: [NetworkLoggerPlugin()]
  2. 在Moya pod的NetworkLoggerPlugin.swift文件中,您可以在给定的logOptions结构内更改Configuration。在初始化方法中,logOptions: LogOptions = .requestBody可以更改。这是一个枚举。因此,您可以尝试根据需要更改logOptions值。

*我认为可以更改pod文件,因为它不会影响代码库,因为这是开发人员端的日志记录选项

答案 4 :(得分:0)

Cross-posted

这是一个详细的插件示例,将同时显示请求和响应数据。

将以下代码添加到您从何处致电Moya的任何地方:

struct VerbosePlugin: PluginType {
    let verbose: Bool

    func prepare(_ request: URLRequest, target: TargetType) -> URLRequest {
        #if DEBUG
        if let body = request.httpBody,
           let str = String(data: body, encoding: .utf8) {
            if verbose {
                print("request to send: \(str))")
            }
        }
        #endif
        return request
    }

    func didReceive(_ result: Result<Response, MoyaError>, target: TargetType) {
        #if DEBUG
        switch result {
        case .success(let body):
            if verbose {
                print("Response:")
                if let json = try? JSONSerialization.jsonObject(with: body.data, options: .mutableContainers) {
                    print(json)
                } else {
                    let response = String(data: body.data, encoding: .utf8)!
                    print(response)
                }
            }
        case .failure( _):
            break
        }
        #endif
    }

}

在您的设置中,添加新的插件:

let APIManager = MoyaProvider<API>( plugins: [
    VerbosePlugin(verbose: true)
    ])

这将同时输出正在发出的请求和返回的响应。如果响应是JSON编码的,它将漂亮地打印JSON,否则它将尝试打印出原始响应数据。

答案 5 :(得分:0)

对于Moya 14.0及更高版本,请像这样使用

let plugin: PluginType = NetworkLoggerPlugin(configuration: .init(logOptions: .verbose))

let provider = MoyaProvider<T>(plugins: [plugin])