AFNetWorking 無法實(shí)現(xiàn)的需求
如今很多項(xiàng)目使用AFN來做網(wǎng)絡(luò)請求,但是把SDK打包輸出靜態(tài)包的話,就不方便使用AFN來建構(gòu)代碼了。開發(fā)者集成SDK時(shí),也需要在自己的工程也引入了AFN 诊霹,那么工程編譯就會報(bào)符號表重復(fù)加載的錯誤。
為了解決問題渣淳,并且增加SDK的可移植性脾还,使用原生的 NSMutableURLRequest和NSURLSession 來發(fā)網(wǎng)絡(luò)請求更好一些,同時(shí)能夠解決符號表重復(fù)加載的問題入愧。
server端為了安全對body全報(bào)文進(jìn)行加密鄙漏,使用Content-Type:application/text 類型的數(shù)據(jù)。這種需求AFN無法處理棺蛛。AFN對我們常用的application/json數(shù)據(jù)處理的非常棒怔蚌,默認(rèn)能處理的類型有 application/json,text/json旁赊,text/javascript桦踊。
// AFN 能處理的MediaType類型
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];
原生實(shí)現(xiàn) Content-Type:application/text 類型數(shù)據(jù)請求
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";
// 參數(shù)
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);
// 線程中處理回調(diào)
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
if (failure) {
failure(error);
}
}else{
if (success) {
success(reault);
}
}
});
}];
[task resume];