2014-11-04 145 views

回答

31

像這樣的東西可能是你正在尋找:

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]

這裏有一個如何可能做responseObject()方法,以便對每要求輸出打印。

注意事項:我沒有親自測試過這個代碼,並且可能會在生產中做出不同的選擇。這只是顯示Wenderlich教程代碼如何包含調試日誌記錄。另請注意:由於本教程是Swift 2.0之前版本,因此我使用了舊的println()而不是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) 
    }) 
    } 
} 
+1

真棒,謝謝!你可以發佈你想要的responseObject擴展的代碼嗎? – trauzti 2015-06-19 16:08:02

+2

順便說一下,這段代碼不適用於Alamofire 3 :) – 2015-12-31 02:11:15

+0

現在還沒有時間重新訪問這個,@MatthieuRiegler。小心提供與v3兼容的寫入? :) – clozach 2016-01-14 01:31:41

9

Timberjack是你在找什麼。 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 
}() 
} 
+0

你如何限制它到一個NSURLSession? – micap 2016-05-04 01:50:35

0

添加到上面的回答 爲Alamofire 4。0+斯威夫特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.cancel()你回到之前的任何地方自我

13

有一個甜美的小豆莢爲此: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 
+1

這是最好的選擇,因爲它不需要對現有代碼進行任何更改。 – manmal 2017-08-22 10:28:39

+0

不適用於迦太基 – PerrierCitror 2017-10-30 12:50:33

-1

解SWIFT 3.0+

打印申請參數和頭:

Alamofire.request(url, method: .get, parameters: parameters, headers: headers) 
      .validate() 
      .responseObject { (response: DataResponse<T>) in 
       self.pendingRequests.removeValue(forKey: endPoint) 
       completion!(response) 

       if(NetworkConfig.loggingEnable) { 
        debugPrint("************* printing REQUEST parameter and Headers *************") 
        debugPrint("RESPONSE : \(response.debugDescription)") 
       } 
     }.responseDebugPrint() 

For Printing Response。使用以下擴展名。

import Foundation 
import Alamofire 

extension Alamofire.DataRequest { 
    func responseDebugPrint() -> Self { 
     if NetworkConfig.loggingEnable { 

      return responseJSON() { 
       response in 
       if let JSON = response.result.value, 
        let JSONData = try? JSONSerialization.data(withJSONObject: JSON, options: .prettyPrinted), 
        let prettyString = NSString(data: JSONData, encoding: String.Encoding.utf8.rawValue) { 
        print(prettyString) 
       } else if let error = response.result.error { 
        print("Error Debug Print: \(error.localizedDescription)") 
       } 
      } 
     } 
     return self 
    } 
} 

小要點爲您提供: https://gist.github.com/manishpathak99/348f2eb0167c0ff6e12ecd667612bc9b/edit