Alamofire를 사용하여 각 요청 / 응답을 어떻게 기록 할 수 있습니까?
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 () 접근 방식을 수행하는 방법입니다 .
경고 강사 : 개인적으로이 코드를 테스트하지 않았으며 프로덕션에서 다른 선택을 할 것입니다. 이것은 Wenderlich 튜토리얼 코드가 디버그 로깅을 포함하는 방법을 보여줍니다. 또한 참고 : 튜토리얼은 스위프트 2.0 이전 버전이므로 print () 대신 이전 println ()을 사용했습니다.
@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
이것을 podfile에 추가하십시오.
pod 'AlamofireNetworkActivityLogger', '~> 2.0'
AppDelegate에서 :
import AlamofireNetworkActivityLogger
그런 다음에 다음 didFinishLaunchingWithOptions
을 추가하십시오.
NetworkActivityLogger.shared.level = .debug
NetworkActivityLogger.shared.startLogging()
편집 : 실제로 프로덕션에서 충돌이 발생했습니다. 안전을 위해 "build flags"를 사용하여 다음과 같이 디버그에서만 사용하십시오.
#if DEBUG
NetworkActivityLogger.shared.level = .debug
NetworkActivityLogger.shared.startLogging()
#endif
Timberjack is what you are looking. Timberjack is a simple, unintrusive network activity logger. Log every request your app makes, or limit to only those using a certain NSURLSession if you’d prefer. It also works with Alamofire, if that’s your thing.
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
}()
}
Adding to above answer for Alamofire 4.0+ Swift 3
extension DataRequest {
public func LogRequest() -> Self {
//Your logic for logging
return self
}
}
When Requesting
Alamofire.request(requestUrl, method: .post, parameters: parameter, encoding: JSONEncoding.default)
.LogRequest()
.responseJSON { response in
//Do your thing
}
If you want to cancel the request in any case(which was something I wanted) you can self.cancel()
anywhere before you return self
Since Alamofire 5, the easiest way is to define an EventMonitor
subclass:
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)")
}
}
Then use it on your session:
let session = Session(eventMonitors: [ AlamofireLogger() ])
This sample code was adapted from https://github.com/Alamofire/Alamofire/issues/2867#issuecomment-509662892
SOLUTION FOR SWIFT 3.0+
For Printing Request parameter and headers:
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 . use below extension .
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
}
}
Small gist for you : https://gist.github.com/manishpathak99/348f2eb0167c0ff6e12ecd667612bc9b/edit
ReferenceURL : https://stackoverflow.com/questions/26736428/how-can-i-log-each-request-response-using-alamofire
'Development Tip' 카테고리의 다른 글
Qt5에서 JSon 파일을 생성 / 읽기 / 쓰기하는 방법 (0) | 2021.01.07 |
---|---|
Mailgun : 메시지가 "수락 됨"이지만 배달 시간이 오래 걸리거나 배달되지 않음 (0) | 2021.01.07 |
Angular 2에서 한 구성 요소에서 다른 구성 요소로 객체를 전달하는 방법은 무엇입니까? (0) | 2021.01.07 |
float를 위치 형식의 문자열로 변환 (과학 표기법 및 잘못된 정밀도 없음) (0) | 2021.01.07 |
try .. catch .. finally로 Javascript 오류 처리 (0) | 2021.01.07 |