AFNetworkActivityLogger打印请求日志

Gitdi地址:https://github.com/peilinghui/AFNetworkActivityLogger
用法:

    [[AFNetworkActivityLogger sharedLogger] setLevel:AFLoggerLevelDebug];
//开启日志
    [[AFNetworkActivityLogger sharedLogger] startLogging];

看了一下,也不难就一个.h一个.m。

  1. 在.h中
    用枚举定义了Off,Debug,Info,Warn,还有Error.
    一个类方法sharedLogger.两个实例方法startLogging和stopLogging;
  2. 在.m中
    先导入#import ,主要是检测网络请求。
    先定义static变量NSURLRequest,NSError,NSURLResponse(Foundation框架中的)
    在实现中,类方法就是
    static dispatch_once_t onceToken;
    
    dispatch_once(&onceToken, ^{
        _sharedLogger = [[self alloc] init];
    });```
在实例方法中就是
  
-startLogging中addObserve两个@selector,一个是networkReqeustDidStart,一个是networkRequestDidFinish。
-stopLogging中removeObserve。
3. 实现两个@selector
  a.networkReqeustDidStart
用到了runtime中的设置属性 objc_setAssociatedObject,主要是是可以在switch中的Debug模式下加入代码来实现。比如:

case TDFLoggerLevelDebug: {
NSMutableString *commandLineString = [@"http --form " mutableCopy];
[commandLineString appendFormat:@"%@ '%@' ", request.HTTPMethod, [[request URL] absoluteString]];

        [request.allHTTPHeaderFields enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSString * _Nonnull obj, BOOL * _Nonnull stop) {
            [commandLineString appendFormat:@"'%@':'%@' ", key, obj];
        }];
        
        if (body.length) {
            NSArray *parts = [body componentsSeparatedByString:@"&"];
            
            [parts enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                NSArray *pair = [obj componentsSeparatedByString:@"="];
                NSString *key = nil;
                
                if ([pair.firstObject respondsToSelector:@selector(stringByRemovingPercentEncoding)]) {
                    key = [pair.firstObject stringByRemovingPercentEncoding];
                }else {
                    key = [pair.firstObject stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
                }
                
                NSString *value = nil;
                
                if ([pair.lastObject respondsToSelector:@selector(stringByRemovingPercentEncoding)]) {
                    value = [pair.lastObject stringByRemovingPercentEncoding];
                }else {
                    value = [pair.lastObject stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
                }
                
                value = [value stringByReplacingOccurrencesOfString:@"'" withString:@"\\'"];
                
                [commandLineString appendFormat:@"'%@'=$'%@' ", key, value];
            }];
            
        }
        
        NSLog(@"%@", commandLineString);
    }
        
        break;
就可以在程序运行的时候调用服务器提供的接口,打印出信息:比如:
`http --form POST http://10.1.5.109:8080/boss-api//bill/v1/get_payment_record_by_day format='json' find_date='2016-07-21' pay_type='1' session_key='100008999262778ea3c4ffd4efed2e80c68fa2f9a7da33' page='1' sign='b233d533da2379d2fa0bd91c852922e8' page_size='20'`



b.networkRequestDidFinish
用官方的就行,还有在添加:`id responseObject = notification.userInfo[AFNetworkingTaskDidCompleteSerializedResponseKey];`




4.写个单元测试测试一下
  • (void)testLogger {
    XCTestExpectation *expectcation = [self expectationWithDescription:@"log test"];

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager POST:@"http://httpbin.org/post" parameters:@{
    @"key1" : @"va=lue1",
    @"key2" : @"{"key" : value}",
    @"key3" : @"valu''''''''''e3",
    @"key4" : @"value4",
    }progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
    [expectcation fulfill];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    [expectcation fulfill];
    }];

    [self waitForExpectationsWithTimeout:15.0f handler:^(NSError * _Nullable error) {

    }];
    }


你可能感兴趣的:(AFNetworkActivityLogger打印请求日志)