AFNetworkActivityLogger
是AFNetworking的一个扩展库, 用来打印HTTP请求日志。
AFNetworkActivityLogger
在GitHub上的网址:https://github.com/AFNetworking/AFNetworkActivityLogger
1、查询AFNetworkActivityLogger
的版本:
pod search AFNetworkActivityLogger
2、把查询到的依赖信息复制到Podfile
文件中,示例:
pod 'AFNetworkActivityLogger', '~> 3.0.0'
3、安装:
pod install
在AppDelegate.m
文件中的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中加入如下的代码:
AFNetworkActivityLogger *logger = [AFNetworkActivityLogger sharedLogger];
[logger setLogLevel:AFLoggerLevelDebug];
[logger startLogging];
当然,要想使它能正常工作,您必须要导入头文件:
#import "AFNetworkActivityLogger.h"
当使用AFHTTPResponseSerializer
的时候,HTTP响应体被解析成NSData, 在使用NSLog输出的时候自然就是十六进制表示的数据,这个表示并不直观。假如我们的HTTP响应体是字符串, 我们应该把NSData转换成NSString输出,这样才直观。 也就是说AFNetworkActivityLogger
还可以做的更多。
如何确定HTTP响应体是不是字符串内容呢?答案是根据响应头中的Content-Type
头的值来判断,常用的有关文本的头包括:application/json
、application/x-www-form-urlencoded
、application/xml
、text/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。