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

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

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

【问题讨论】:

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

标签: ios swift moya


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

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

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多