Есть ли способ зарегистрировать каждый запрос/ответ, используя Alamofire (что-то похожее на AFNetworkActivityLogger)?
Я знаю Printable, DebugPrintable и Output (cURL), но они не совсем то, что я ищу.
Есть ли способ зарегистрировать каждый запрос/ответ, используя Alamofire (что-то похожее на AFNetworkActivityLogger)?
Я знаю 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() для печати вывода по каждому запросу.
Caveat lector: Я лично не тестировал этот код и, вероятно, делал бы разные варианты в производстве. Это просто показывает, как код учебника 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)
})
}
}
Для этого есть сладкий стручок: https://github.com/konkab/AlamofireNetworkActivityLogger
Добавьте это к своему подфайлу:
pod 'AlamofireNetworkActivityLogger', '~> 2.0'
В вашем AppDelegate:
import AlamofireNetworkActivityLogger
Затем в свой didFinishLaunchingWithOptions
добавьте следующее:
NetworkActivityLogger.shared.level = .debug
NetworkActivityLogger.shared.startLogging()
EDIT: Я на самом деле столкнулся с сбоями с этим в производстве. чтобы быть в безопасности, используйте "флаги сборки", чтобы использовать это только в отладке, что-то вроде этого:
#if DEBUG
NetworkActivityLogger.shared.level = .debug
NetworkActivityLogger.shared.startLogging()
#endif
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
}()
}
Добавление к приведенному выше ответу для 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.cancel()
в любом месте, прежде чем вернуть self
Начиная с Alamofire 5, самый простой способ - определить подкласс EventMonitor
:
final class AlamofireLogger: EventMonitor {
func requestDidResume(_ request: Request) {
let body = request.request.flatMap { $0.httpBody.map { String(decoding: $0, as: UTF8.self) } } ?? "None"
let message = """
⚡️ Request Started: \(request)
⚡️ Body Data: \(body)
"""
NSLog(message)
}
func request<Value>(_ request: DataRequest, didParseResponse response: DataResponse<Value>) {
NSLog("⚡️ Response Received: \(response.debugDescription)")
}
}
Затем используйте его в своей сессии:
let session = Session(eventMonitors: [ AlamofireLogger() ])
Этот пример кода был адаптирован из https://github.com/Alamofire/Alamofire/issues/2867#issuecomment-509662892
РЕШЕНИЕ ДЛЯ 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()
Для ответа на печать. используйте ниже расширения.
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