iOS 网络请求封装
NetWorkManager.h
#import <Foundation/Foundation.h> @interface NetWorkManager : NSObject //文件下载 +(void)downFile:(NSString *)fileUrl succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock; //基于使用Protobuf的GET请求(heards自定义请求头参数) + (void)getForProtobuf:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock; //基于使用压缩Protobuf的GET请求(heards自定义请求头参数) + (void)getForProtobufZip:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock; //基于使用Json的GET请求(heards自定义请求头参数) + (void)getForJson:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock; //基于使用压缩Json的GET请求(heards自定义请求头参数) + (void)getForJsonZip:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock; //基于使用Protobuf的POST请求(heards自定义请求头参数) + (void)postForProtobuf:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock; //基于使用压缩Protobuf的POST请求(heards自定义请求头参数) + (void)postForProtobufZip:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock; //基于使用Json的POST请求(heards自定义请求头参数) + (void)postForJson:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock; //基于使用压缩Json的POST请求(heards自定义请求头参数) + (void)postForJsonZip:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock; @end
NetWorkManager.m
#import "NetWorkManager.h" #import <zlib.h> @implementation NetWorkManager //文件下载 +(void)downFile:(NSString *)fileUrl succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock{ NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:fileUrl]]; [self request:urlRequest succeedBlock:succeedblock failBlock:failblock]; } + (void)getForProtobuf:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock{ [self request:url hTTPMethod:@"GET" requestParams:data heards:header contentType:@"application/x-protobuf" needZip:NO succeedBlock:succeedblock failBlock:failblock]; } + (void)getForProtobufZip:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock{ [self request:url hTTPMethod:@"GET" requestParams:data heards:header contentType:@"application/x-protobuf" needZip:YES succeedBlock:succeedblock failBlock:failblock]; } + (void)getForJson:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock{ [self request:url hTTPMethod:@"GET" requestParams:data heards:header contentType:@"application/json" needZip:NO succeedBlock:succeedblock failBlock:failblock]; } + (void)getForJsonZip:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock{ [self request:url hTTPMethod:@"GET" requestParams:data heards:header contentType:@"application/json" needZip:YES succeedBlock:succeedblock failBlock:failblock]; } + (void)postForProtobuf:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock{ [self request:url hTTPMethod:@"GET" requestParams:data heards:header contentType:@"application/x-protobuf" needZip:NO succeedBlock:succeedblock failBlock:failblock]; } + (void)postForProtobufZip:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock{ [self request:url hTTPMethod:@"POST" requestParams:data heards:header contentType:@"application/x-protobuf" needZip:YES succeedBlock:succeedblock failBlock:failblock]; } + (void)postForJson:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock{ [self request:url hTTPMethod:@"POST" requestParams:data heards:header contentType:@"application/json" needZip:NO succeedBlock:succeedblock failBlock:failblock]; } + (void)postForJsonZip:(NSString *)url requestParams:(NSData *)data heards:(NSDictionary *)header succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock{ [self request:url hTTPMethod:@"POST" requestParams:data heards:header contentType:@"application/json" needZip:YES succeedBlock:succeedblock failBlock:failblock]; } + (void)request:(NSString *)url hTTPMethod:(NSString *)method requestParams:(NSData *)data heards:(NSDictionary *)header contentType:(NSString*)contentType needZip:(BOOL)needZip succeedBlock:(void (^)(NSData * data))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock{ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; [request setTimeoutInterval:10.0f];// 设置请求超时 [request setHTTPMethod:method]; // 设置请求方法 [request setValue:contentType forHTTPHeaderField:@"Content-Type"];//数据类型为proto格式 if(header && [header.allKeys count]>0){ for (NSString * key in header.allKeys) { NSString * value = [header objectForKey:key]; [request setValue:value forHTTPHeaderField:key];//自定义请求头参数 } } if(needZip){ [request setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];//服务端支持gzip压缩 NSData *dataTemp = [self gzippedDataWithData:data];//压缩 [request setHTTPBody:dataTemp]; }else{ [request setHTTPBody:data]; } [self request:request succeedBlock:^(NSData *resultdata) { succeedblock(resultdata); } failBlock:^(NSString *errorstr) { failblock(errorstr); }]; } + (void)request:(NSURLRequest *)request succeedBlock:(void (^)(NSData * resultdata))succeedblock failBlock:(void (^)(NSString * errorstr)) failblock{ dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration]; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { dispatch_async(dispatch_get_main_queue(), ^{ if(error){ failblock(error.localizedFailureReason); }else if(data && [data length]>0){ succeedblock(data); }else{ failblock(@"data is null"); } }); }]; [dataTask resume]; }); } +(NSData *)gzippedDataWithData:(NSData *)oldData { float level = -0.1f; if (oldData.length == 0) { return oldData; } z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; stream.avail_in = (uint)oldData.length; stream.next_in = (Bytef *)(void *)oldData.bytes; stream.total_out = 0; stream.avail_out = 0; static const NSUInteger ChunkSize = 16384; NSMutableData *output = nil; int compression = (level < 0.0f)? Z_DEFAULT_COMPRESSION: (int)(roundf(level * 9)); if (deflateInit2(&stream, compression, Z_DEFLATED, 31, 8, Z_DEFAULT_STRATEGY) == Z_OK) { output = [NSMutableData dataWithLength:ChunkSize]; while (stream.avail_out == 0) { if (stream.total_out >= output.length) { output.length += ChunkSize; } stream.next_out = (uint8_t *)output.mutableBytes + stream.total_out; stream.avail_out = (uInt)(output.length - stream.total_out); deflate(&stream, Z_FINISH); } deflateEnd(&stream); output.length = stream.total_out; } return output; } @end
点个赞再走呗。。。
如有疑问,联系作者
博客园:这个我不知道诶

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库