有没有办法使用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