web-dev-qa-db-ja.com

Alamofireを使用して各リクエスト/レスポンスを記録するにはどうすればよいですか?

Alamofire(AFNetworkActivityLoggerに似たもの)を使用して各リクエスト/レスポンスを記録する方法はありますか?

Printable、DebugPrintable、およびOutput(cURL)は知っていますが、探しているものとはまったく異なります。

54
Cosmin

このようなものがあなたが探していたものかもしれません:

extension Request {
   public func debugLog() -> Self {
      #if DEBUG
         debugPrint(self)
      #endif
      return self
   }
}

使用法:

Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
         .debugLog()
         .response {…}

すべての応答を印刷する場合は、このチュートリアルの上部にあるresponseObject()メソッドに似た独自の応答メソッドを作成できます。

http://www.raywenderlich.com/87595/intermediate-alamofire-tutorial

[更新:@trauztiからのリクエストごとに以下に追加。]

次に、everyリクエストで出力を印刷するためにresponseObject()アプローチを行う方法を示します。

警告:私はこのコードを個人的にテストしたことはないので、本番環境ではおそらく異なる選択をするでしょう。これは、Wenderlichチュートリアルコードにデバッグログを含める方法を示しています。また、注意:チュートリアルはSwift 2.0より前なので、print()の代わりに古いprintln()を使用しました。

@objc public protocol ResponseObjectSerializable {
  init(response: NSHTTPURLResponse, representation: AnyObject)
}

extension Alamofire.Request {
  public func responseObject<T: ResponseObjectSerializable>(completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, NSError?) -> Void) -> Self {
    let serializer: Serializer = { (request, response, data) in

      #if DEBUG
         println("Request: \(request.URL)")
      #endif

      let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
      let (JSON: AnyObject?, serializationError) = JSONSerializer(request, response, data)
      if response != nil && JSON != nil {
        #if DEBUG
           println("Response:")
           debugPrint(JSON)
        #endif

        return (T(response: response!, representation: JSON!), nil)
      } else {
        #if DEBUG
           println("Failed Serialization:")
           debugPrint(serializationError)
        #endif

        return (nil, serializationError)
      }
    }

    return response(serializer: serializer, completionHandler: { (request, response, object, error) in
      completionHandler(request, response, object as? T, error)
    })
  }
}
45
clozach

これには甘いポッドがあります: https://github.com/konkab/AlamofireNetworkActivityLogger

これをポッドファイルに追加します。

pod 'AlamofireNetworkActivityLogger', '~> 2.0'

AppDelegateで:

import AlamofireNetworkActivityLogger

次に、didFinishLaunchingWithOptionsに以下を追加します:

NetworkActivityLogger.shared.level = .debug
NetworkActivityLogger.shared.startLogging()

編集:私は実際に本番環境でこれにクラッシュが発生しました。安全のために、「ビルドフラグ」を使用して、デバッグでのみこれを使用します。次のようなものです。

#if DEBUG
    NetworkActivityLogger.shared.level = .debug
    NetworkActivityLogger.shared.startLogging()
#endif
32
ullstrm

ティンバージャックはあなたが探しているものです。 Timberjackは、シンプルで邪魔にならないネットワークアクティビティロガーです。アプリが行うすべてのリクエストを記録するか、必要に応じて特定のNSURLSessionを使用するリクエストのみに制限します。それがあなたのことなら、Alamofireでも動作します。

https://cocoapods.org/pods/Timberjack

使用法:

import Alamofire
import Timberjack

class HTTPManager: Alamofire.Manager {
static let sharedManager: HTTPManager = {
    let configuration = Timberjack.defaultSessionConfiguration()
    let manager = HTTPManager(configuration: configuration)
    return manager
}()
}
10
ali

Alamofire 4.0+の上記の回答に追加Swift 3

_extension DataRequest {        
        public func LogRequest() -> Self {
        //Your logic for logging
        return self
    }
}
_

リクエストするとき

_Alamofire.request(requestUrl, method: .post, parameters: parameter, encoding: JSONEncoding.default)
            .LogRequest()
            .responseJSON { response in
            //Do your thing
            }
_

どんな場合でもリクエストをキャンセルしたい場合(これは私が望んでいたものでした)、selfを返す前にどこでもself.cancel()できます

5
vinbhai4u