【问题标题】:How can I log each request/response using AFHTTPSessionManager?如何使用 AFHTTPSessionManager 记录每个请求/响应?
【发布时间】:2014-06-15 17:24:25
【问题描述】:

我正在将我的项目迁移到 AFNetworking 2.0。在使用 AFNetworking 1.0 时,我编写了代码以在控制台中记录每个请求/响应。代码如下:

-(AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request
                                                   success:(void (^)(AFHTTPRequestOperation *, id))success
                                                   failure:(void (^)(AFHTTPRequestOperation *, NSError *))failure
{
    AFHTTPRequestOperation *operation =
    [super HTTPRequestOperationWithRequest:request
        success:^(AFHTTPRequestOperation *operation, id responseObject){
             [self logOperation:operation];
             success(operation, responseObject);
        }
        failure:^(AFHTTPRequestOperation *operation, NSError *error){
             failure(operation, error);
    }];

    return operation;
}

-(void)logOperation:(AFHTTPRequestOperation *)operation {

    NSLog(@"Request URL-> %@\n\nRequest Body-> %@\n\nResponse [%d]\n%@\n%@\n\n\n",
    operation.request.URL.absoluteString,
    [[NSString alloc] initWithData:operation.request.HTTPBody encoding:NSUTF8StringEncoding],
    operation.response.statusCode, operation.response.allHeaderFields, operation.responseString);
}

我正在尝试使用 AFNetworking 2.0 做同样的事情,据我了解,这意味着使用 NSURLSessionDataTask 对象而不是 AFHTTPRequestOperation。这是我的尝试。

-(NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler {

    NSURLSessionDataTask *task = [super dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error){

        [self logTask:task];
        completionHandler(response, responseObject, error);
    }];

    return task;
}

-(void)logTask:(NSURLSessionDataTask *)task {

    NSString *requestString = task.originalRequest.URL.absoluteString;
    NSString *responseString = task.response.URL.absoluteString;

    NSLog(@"\n\nRequest - %@\n\nResponse - %@\n\n", requestString, responseString);
}

dataTaskWithRequest:completionHandler 方法成功拦截了每个调用,所以我认为这是正确的重写方法,但是当我尝试在 completionHandler 中记录任务时,task 为 nil。从而在控制台中打印空值。但是,该方法仍会返回正确的任务对象。这里发生了什么事?如何正确记录每个呼叫的请求/响应?

【问题讨论】:

    标签: ios afnetworking afnetworking-2 nsurlsessiontask


    【解决方案1】:

    您可以使用库 AFNetworking/AFNetworkActivityLogger

    https://github.com/AFNetworking/AFNetworkActivityLogger

    来自文档:

    AFNetworkActivityLogger 是 AFNetworking 2.0 的扩展,用于记录 发送和接收网络请求。

    用法:

    [[AFNetworkActivityLogger sharedLogger] startLogging];
    

    输出:

    GET http://example.com/foo/bar.json
    200 http://example.com/foo/bar.json
    

    使用开发日志级别,您应该也有 responseHeaderFields 和 responseString

    【讨论】:

    • 谢谢,我会看看这个。但是我仍然希望有一个与我的代码相关的解决方案。
    • swift中的设置示例:var networkLogger = AFNetworkActivityLogger.sharedLogger() networkLogger.startLogging() networkLogger.level = AFHTTPRequestLoggerLevel.AFLoggerLevelDebug
    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2019-03-16
    • 2016-05-01
    相关资源
    最近更新 更多