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

Posted

技术标签:

【中文标题】我们如何使用 Moya 调试/查看通过 API 设置的请求?【英文标题】:How do we debug/see the request being set over API with Moya? 【发布时间】:2019-01-09 08:03:12 【问题描述】:

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

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

【问题讨论】:

在 moya 中使用 NetworkLoggerPlugin.swift --> willSend 你会得到完整的请求 例如,您从here获取样本 感谢您的回复。征得您的许可,我将其添加为答案,以便对其他人有所帮助。 【参考方案1】:

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

var provider = MoyaProvider<MainAPI>()

与:

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

MOYA >= 14

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

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

感谢@Anbu.Karthik

【讨论】:

很高兴看到这个 从 moya 14.0 开始我们不能使用 verbose: true 从 Moya 14 我们不能使用它【参考方案2】:

从 Moya 14.0 开始,您需要这样做:

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

【讨论】:

【参考方案3】:

如果从 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&lt;AuthService&gt;(plugins: [VerbosePlugin(verbose: true)])

【讨论】:

【参考方案4】:

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】:

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

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

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

【讨论】:

【参考方案6】:
    使用它来设置提供程序let provider: MoyaProvider&lt;API&gt; = MoyaProvider&lt;API&gt;(plugins: [NetworkLoggerPlugin()] 在 Moya pod 的NetworkLoggerPlugin.swift 文件中,您可以在给定的Configuration 结构内更改logOptions。在init方法中logOptions: LogOptions = .requestBody可以改变。这是一个枚举。因此,您可以尝试根据需要更改 logOptions 值。

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

【讨论】:

嗨,有没有办法使用 NetworkLoggerPlugin logOptions 在编译器中查看我的日志请求和响应?谢谢你。 (***.com/questions/61479627/…)

以上是关于我们如何使用 Moya 调试/查看通过 API 设置的请求?的主要内容,如果未能解决你的问题,请参考以下文章

Moya - 无法使用身份验证凭据调用 api

moya 与 RxSwift 使用

如何在 Moya 中传递 URLRequest

使用 Moya 刷新身份验证令牌

理解 Realm、Moya 和 ObjectMapper

使用 Moya 将参数附加到每个网络调用