AFNetworking封装实践 2022-04-17 周日

2022-04-25  本文已影响0人  松哥888

简介

方案一:直接使用Http接口

既然是HTTPS,而且是JSON解析,AFNetworking也提供了顶层的POST和GET接口,封装一下很方便。

/**
 http method (1:POST,2:GET) ,
 */
typedef NS_ENUM(NSInteger,PDAHTTPMethod) {
    PDAHTTPMethodPOST = 1,
    PDAHTTPMethodGET = 2,
};

+ (void)networkWithMethod:(PDAHTTPMethod)method
                     url:(NSString *)urlString
              parameters:(nullable NSDictionary *)parameters
                 headers:(nullable NSDictionary <NSString *, NSString *> *)headers
                 success:(nullable void(^)(id _Nullable response))success
                 failure:(nullable void(^)(NSError * _Nullable error))failure {
   
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFJSONRequestSerializer serializerWithWritingOptions:NSJSONWritingPrettyPrinted];
    manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingMutableContainers];
    
    
    if (method == PDAHTTPMethodPOST) {
        [manager POST:urlString parameters:parameters headers:headers progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            if (success != nil) {
                success(responseObject);
            }
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            if (failure != nil) {
                failure(error);
            }
        }];
    }
    
    if (method == PDAHTTPMethodGET) {
        [manager GET:urlString parameters:parameters headers:headers progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            if (success != nil) {
                success(responseObject);
            }
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            if (failure != nil) {
                failure(error);
            }
        }];
    }
}

方案二:封装NSURLSessionDataTask接口

// 包装dataTaskWithRequest
+ (void)HTTTPWithMethod:(PDAHTTPMethod)method
                    url:(NSString *)urlString
             parameters:(nullable NSDictionary *)parameters
                headers:(nullable NSDictionary <NSString *, NSString *> *)headers
                success:(nullable void(^)(id _Nullable response))success
                failure:(nullable void(^)(NSError * _Nullable error))failure {
    // url
    NSURL *url = nil;
    if (method == PDAHTTPMethodPOST) {
        url = [NSURL URLWithString:urlString];
    }
    if (method == PDAHTTPMethodGET) {
        // get请求拼接参数
        NSMutableString *urlWithQury = [NSMutableString stringWithString:urlString];
        if ((parameters != nil) && (parameters.count > 0)) {
            [urlWithQury appendString:@"?"];
            NSArray *keys = parameters.allKeys;
            for (NSInteger i = 0; i < keys.count; i++) {
                NSString *keyAndValue = [NSString stringWithFormat:@"%@=%@", keys[i], [parameters objectForKey:keys[i]]];
                [urlWithQury appendString:keyAndValue];
                if (i != (parameters.count - 1)){
                    [urlWithQury appendString:@"&"];
                }
            }
        }
        url = [NSURL URLWithString:[urlWithQury copy]];
    }
    
    // request
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    
    // method
    if (method == PDAHTTPMethodPOST) {
        [request setHTTPMethod:@"POST"];
    }
    if (method == PDAHTTPMethodGET) {
        [request setHTTPMethod:@"GET"];
    }
    
    // body 只有POST才需要设置body
    if ((parameters != nil) && (parameters.count > 0) && (method == PDAHTTPMethodPOST)) {
        NSData *jsonData = [PDAJSON dictionaryToJsonData:parameters];
        if (jsonData != nil) {
            [request setHTTPBody:jsonData];
        }
    }
    
    // headers
    if ((headers != nil) && (headers.count > 0)) {
        [headers enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSString * _Nonnull obj, BOOL * _Nonnull stop) {
            [request setValue:obj forHTTPHeaderField:key];
        }];
    }
    
    // 顶层的POST,GET接口在JSON转换的过程中有问题,所以用更底层的dataTask接口;关键是自己组NSURLRequest,避开AFNetworking本身的坑
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 没有baseURL,在设置securityPolicy的时候会崩溃
    
    // 执行dataTask
    NSURLSessionDataTask *task = [manager dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        if (error == nil) {
            if (success != nil) {
                success(responseObject);
            }
        } else {
            if (failure != nil) {
                failure(error);
            }
        }
    }];
    
    // 启动任务
    [task resume];
}
上一篇 下一篇

猜你喜欢

热点阅读