web-dev-qa-db-fra.com

Comment puis-je enregistrer chaque demande / réponse à l'aide d'Alamofire?

Existe-t-il un moyen de consigner chaque demande/réponse en utilisant Alamofire (quelque chose de similaire à AFNetworkActivityLogger)?

Je connais Printable, DebugPrintable et Output (cURL) mais ils ne sont pas tout à fait ce que je recherche.

54
Cosmin

Quelque chose comme ça pourrait être ce que vous cherchiez:

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

Usage:

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

Si vous souhaitez imprimer toutes les réponses, vous pouvez écrire votre propre méthode de réponse, similaire à la méthode responseObject () en haut de ce didacticiel:

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

[Mise à jour: ajoutée ci-dessous à la demande de @trauzti.]

Voici comment on pourrait faire l'approche responseObject () afin d'imprimer la sortie sur chaque requête.

Avertissement: je n'ai pas personnellement testé ce code et ferais probablement des choix différents en production. Cela montre simplement comment le code du didacticiel Wenderlich peut inclure la journalisation du débogage. Notez également: comme le tutoriel est antérieur à Swift 2.0, j'ai utilisé l'ancien println () au lieu de print ().

@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

Il y a un petit pod doux pour cela: https://github.com/konkab/AlamofireNetworkActivityLogger

Ajoutez ceci à votre podfile:

pod 'AlamofireNetworkActivityLogger', '~> 2.0'

Dans votre AppDelegate:

import AlamofireNetworkActivityLogger

Ensuite, dans votre didFinishLaunchingWithOptions, ajoutez ceci:

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

EDIT: J'ai effectivement rencontré des plantages avec cela en production. Pour être sûr, utilisez "build flags" pour n'utiliser cela que dans le débogage, quelque chose comme ceci:

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

Timberjack est ce que vous cherchez. Timberjack est un enregistreur d'activité réseau simple et non intrusif. Enregistrez chaque demande de votre application, ou limitez-la à celles qui utilisent une certaine session NSURL si vous préférez. Cela fonctionne également avec Alamofire, si c'est votre truc.

https://cocoapods.org/pods/Timberjack

usage:

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

Ajout à la réponse ci-dessus pour Alamofire 4.0+ Swift 3

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

Lors de la demande

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

Si vous souhaitez annuler la demande dans tous les cas (ce que je voulais), vous pouvez self.cancel() n'importe où avant de retourner vous-même

5
vinbhai4u