Development Tip

Alamofire를 사용하여 각 요청 / 응답을 어떻게 기록 할 수 있습니까?

yourdevel 2021. 1. 7. 20:05
반응형

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

반응형