AFNetworkActivityLogger
1.1、AFNetworkActivityLogger简介

AFNetworkActivityLoggerAFNetworking的一个扩展库, 用来打印HTTP请求日志。

AFNetworkActivityLoggerGitHub上的网址:https://github.com/AFNetworking/AFNetworkActivityLogger

1.2、使用CocoaPods安装AFNetworkActivityLogger

1、查询AFNetworkActivityLogger的版本:

pod search AFNetworkActivityLogger

2、把查询到的依赖信息复制到Podfile文件中,示例:

pod 'AFNetworkActivityLogger', '~> 3.0.0'

3、安装:

pod install
1.3、使用方法

AppDelegate.m文件中的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入如下的代码:

AFNetworkActivityLogger *logger = [AFNetworkActivityLogger sharedLogger];
[logger setLogLevel:AFLoggerLevelDebug];
[logger startLogging];

当然,要想使它能正常工作,您必须要导入头文件:

#import "AFNetworkActivityLogger.h"
1.4、AFNetworkActivityLogger的缺陷

当使用AFHTTPResponseSerializer的时候,HTTP响应体被解析成NSData, 在使用NSLog输出的时候自然就是十六进制表示的数据,这个表示并不直观。假如我们的HTTP响应体是字符串, 我们应该把NSData转换成NSString输出,这样才直观。 也就是说AFNetworkActivityLogger还可以做的更多。

如何确定HTTP响应体是不是字符串内容呢?答案是根据响应头中的Content-Type头的值来判断,常用的有关文本的头包括:application/jsonapplication/x-www-form-urlencodedapplication/xmltext/html这四种。 所以,我们只要看看Content-Type头的值中是否包含这四个字符串(因为Content-Type头的值中还可以包含编码信息,所以不能进行严格匹配)。

具体做法如下:

1、打开AFNetworkActivityConsoleLogger.m这个文件,在- (void)URLSessionTaskDidFinish:(NSURLSessionTask *)task withResponseObject:(id)responseObject inElapsedTime:(NSTimeInterval )elapsedTime withError:(NSError *)error方法中加入如下的代码:

id responseBody = responseObject;

if(responseHeaderFields != nil && [responseObject isKindOfClass:[NSData class]]) {
    id contentTypeObj = [responseHeaderFields objectForKey:@"Content-Type"];
    if([contentTypeObj isKindOfClass:[NSString class]]) {
        NSString *contentType = contentTypeObj;
        if([contentType containsString:@"application/json"]
           || [contentType containsString:@"application/xml"]
           || [contentType containsString:@"application/x-www-form-urlencoded"]
           || [contentType containsString:@"text/html"]) {
            responseBody = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        }
    }
}

2、在case AFLoggerLevelDebug:中的代码替换成如下:

NSLog(@"%ld '%@' [%.04f s]: %@ %@", (long)responseStatusCode, [[task.response URL] absoluteString], elapsedTime, responseHeaderFields, responseBody);

AFNetworkActivityLogger默认的打印格式并不美观,看起来一团糟,按照HTTP协议本身的格式打印是最好的,所以,我自己实现了一个AFNetworkingLogger