美文网首页
OS封装原生网络请求

OS封装原生网络请求

作者: 笑里剑 | 来源:发表于2018-03-27 14:58 被阅读0次

之前写项目时一直用第三方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

相关文章

  • OS封装原生网络请求

    之前写项目时一直用第三方AFNet进行网络请求,对于原生的网络请求模式很久没有涉猎。所以趁着最近有空对原生的网络请...

  • 如何封装iOS原生网络请求

    今天我想说的是如何封装iOS原生的网络请求 , 本文是基于 NSURLConnection 网络请求的封装 , 实...

  • ios 原生网络请求封装

    最新版本 => ios 原生网络请求封装(新) 引用 使用 get请求 上传 下载 下载地址

  • iOS原生网络请求封装

    在iOS开发中, 有很多十分好用的库, 以至于大家达成了共识, 每次在遇到这个功能自然而然的就想到用哪个第三方库....

  • AFNetworking源码浅析

    本文将从最简单的GET请求方法的使用入手,由表及里,逐步探究AFNetworking如何封装处理原生的网络请求。 ...

  • Android的网络请求框架

    前言 现在很多的app都是依赖网络服务的应用。跟服务器通讯我们就要用到网络请求。网络请求的框架有很多:原生自己封装...

  • ios 原生网络请求封装(新)

    引用 按需组合 get方法(例子:简易使用) post方法(例子:包含请求头、url编码) upload方法(例子...

  • 原生js ajax网络数据请求 XMLHttprequest、A

    再学封装ajax请求 原生JS,AJAX数据封装 兼容性处理 脚本: 请求操作:

  • ReactiveCocoa简单使用

    传统网络请求封装 ReactiveCocoa网络请求封装 关于传统的网络请求的封装,大家都很熟悉,这里就不再赘述了...

  • swift网络请求

    AFNetworking三方封装的网络请求 AFNetworking三方封装的网络请求

网友评论

      本文标题:OS封装原生网络请求

      本文链接:https://www.haomeiwen.com/subject/gvxscftx.html