iOS NSURLSession处理application/text 类型数据

AFNetWorking 无法实现的需求

如今很多项目使用AFN来做网络请求,但是把SDK打包输出静态包的话,就不方便使用AFN来建构代码了。开发者集成SDK时,也需要在自己的工程也引入了AFN ,那么工程编译就会报符号表重复加载的错误。

为了解决问题,并且增加SDK的可移植性,使用原生的 NSMutableURLRequestNSURLSession 来发网络请求更好一些,同时能够解决符号表重复加载的问题。

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];

你可能感兴趣的:(iOS NSURLSession处理application/text 类型数据)