OS封装原生网络请求

之前写项目时一直用第三方AFNet进行网络请求,对于原生的网络请求模式很久没有涉猎。所以趁着最近有空对原生的网络请求进行了一个封装,算是一个复习吧。
苹果推荐使用NSURLSession框架进行网络请求,所以封装是在NSURLSession的基础上进行的封装。本次封装的主文件在为NetWorkingHelper类,由于为了方面进行数据转换和检查还引入了两个类OWInstrument和NSURL+CheckUrl。
NetWorkingHelper.h

#import <Foundation/Foundation.h>

@interface NetWorkingHelper : NSObject

+(void)getDataWithUrlStr:(NSString *)url
            successBlock:(void (^)(id obj))success
             failueBlock:(void (^)(id obj))failue;

+(void)postDataWithParamer:(id)paramer
                       url:(NSString *)urlStr
              successBlock:(void (^)(id obj))success
               failueBlock:(void (^)(id obj))failue;
@end

NetWorkingHelper.m

//get请求
+(void)getDataWithUrlStr:(NSString *)url
            successBlock:(void (^)(id))success
             failueBlock:(void (^)(id))failue {
    NetWorkingHelper *helper = [NetWorkingHelper shareDefault];
    //对url进行转码,防止有中文产生
    NSString *urlStr = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSURLSessionDataTask *dataTask = [helper.session dataTaskWithURL:[NSURL URLWithString:urlStr] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            dispatch_async(dispatch_get_main_queue(), ^{
                if (!error) {
                    success(data);
                }else {
                    failue(error);
                }
            });
        }];
        [dataTask resume];
    });
}
//post请求
+(void)postDataWithParamer:(id)paramer url:(NSString *)urlStr successBlock:(void (^)(id))success failueBlock:(void (^)(id))failue {
    NetWorkingHelper *helper = [NetWorkingHelper shareDefault];
    
    NSURL *url = [NSURL URLWithString:urlStr];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//    //设置请求超时时间
//    request.timeoutInterval = 0.5;
//    //设置缓存策略
//    request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
//    //设置请求方式
    request.HTTPMethod = @"POST";
    //设置请求头
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    //设置请求体
    request.HTTPBody = [NetWorkingHelper requestDataWithObj:paramer];
    
    //将网络请求放到子线程去执行
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSURLSessionDataTask *dataTask = [helper.session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            dispatch_async(dispatch_get_main_queue(), ^{
                //在主线程回传数据并处理
                if (!error) {
                    success(data);
                }else {
                    failue(error);
                }
            });
        }];
        [dataTask resume];
    });
}

对于请求数据体的封装需要进行一个一个简单的封装,否则会出现数据错误问题,我这边用这个方法进行处理

//苹果官方的请求体最终封装成字符串类型
+(NSData *)requestDataWithObj:(id)paramer {
    NSString *dataStr = @"";
    if ([paramer isKindOfClass:[NSString class]]) {
        dataStr = [paramer mutableCopy];
    }else if ([paramer isKindOfClass:[NSDictionary class]]) {
        NSArray *keys = [paramer allKeys];
        for (NSString *key in keys) {
            NSString *value = [paramer objectForKey:key];
            NSString *valueAll = [key stringByAppendingString:[NSString stringWithFormat:@"=%@",value]];
            dataStr = [dataStr stringByAppendingString:valueAll];
        }
    }else {
        
    }
    return [dataStr dataUsingEncoding:NSUTF8StringEncoding];
}

以上只简单封装了get和post请求,后续还会进行一些改动,有需要的朋友可以去看demo

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作者:艾琳·博伊尔 当我们不再认为抓紧就是占有不把物质简单地等同于幸福时也就更容易抓住生活的小确喜 是不是只有搬到...
    Treise阅读 725评论 0 0
  • 今天是自己的女神节,首先要祝自己节日快乐。回想今天的教学,感觉今天还可以,前边学习了十几减9,今天我试着让他们自己...
    满天星中队阅读 67评论 0 0
  • 2018年2月1号,今天女儿的作业完成的很快,也很听话,她知道爸爸病了我没时间照顾自己,所以很听话。
    滕旭博阅读 229评论 0 1