1

プロジェクトを 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 でタスクをログに記録しようとすると、tasknil になります。したがって、コンソールに null が出力されます。ただし、そのメソッドからは適切なタスク オブジェクトが返されます。ここで何が起こっているのですか?各呼び出しの要求/応答を適切にログに記録するにはどうすればよいですか?

4

1 に答える 1

6

ライブラリ 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

devel ロギング レベルを使用すると、responseHeaderFields と responseString も必要になります

于 2014-04-29T17:24:19.390 に答える