有沒有辦法使用Alamofire記錄每個請求/響應(類似於AFNetworkActivityLogger)?如何使用Alamofire記錄每個請求/響應?
我知道Printable,DebugPrintable和Output(cURL),但他們不是我正在尋找的。
有沒有辦法使用Alamofire記錄每個請求/響應(類似於AFNetworkActivityLogger)?如何使用Alamofire記錄每個請求/響應?
我知道Printable,DebugPrintable和Output(cURL),但他們不是我正在尋找的。
像這樣的東西可能是你正在尋找:
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)
})
}
}
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
}()
}
你如何限制它到一個NSURLSession? – micap 2016-05-04 01:50:35
添加到上面的回答 爲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()
你回到之前的任何地方自我
有一個甜美的小豆莢爲此: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
這是最好的選擇,因爲它不需要對現有代碼進行任何更改。 – manmal 2017-08-22 10:28:39
不適用於迦太基 – PerrierCitror 2017-10-30 12:50:33
解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
真棒,謝謝!你可以發佈你想要的responseObject擴展的代碼嗎? – trauzti 2015-06-19 16:08:02
順便說一下,這段代碼不適用於Alamofire 3 :) – 2015-12-31 02:11:15
現在還沒有時間重新訪問這個,@MatthieuRiegler。小心提供與v3兼容的寫入? :) – clozach 2016-01-14 01:31:41