AFNetWorking 无法实现的需求
如今很多项目使用AFN来做网络请求,但是把SDK打包输出静态包的话,就不方便使用AFN来建构代码了。开发者集成SDK时,也需要在自己的工程也引入了AFN ,那么工程编译就会报符号表重复加载的错误。
为了解决问题,并且增加SDK的可移植性,使用原生的 NSMutableURLRequest和NSURLSession 来发网络请求更好一些,同时能够解决符号表重复加载的问题。
server端为了安全对body全报文进行加密,使用Content-Type:application/text 类型的数据。这种需求AFN无法处理。AFN对我们常用的application/json数据处理的非常棒,默认能处理的类型有 application/json,text/json,text/javascript。
// AFN 能处理的MediaType类型
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];
原生实现 Content-Type:application/text 类型数据请求
NSString *url = [NSString stringWithFormat:@"%@%@",IP, [data valueForKey:@"url"]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
[request setValue:@"application/text" forHTTPHeaderField:@"Content-Type"];
request.HTTPMethod = @"POST";
// 参数
NSDictionary *dictParams = [data copy];
NSDictionary *params = [dictParams valueForKey:@"params"];
NSDictionary *dictBody = [params valueForKey:@"body"];
NSData *dataEncrypt = [aesEncryptString([self dictToJson:dictBody], key) dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:dataEncrypt];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
id reault = aesDecryptString(jsonString, key);
NSLog(@"dict = %@",reault);
// 线程中处理回调
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
if (failure) {
failure(error);
}
}else{
if (success) {
success(reault);
}
}
});
}];
[task resume];