##写在前面
由于本人在工作中经常会进行网络请求,实在是不想一直写那段请求代码,就自己封装了一个LiynNet类。其中使用代理完成方法回调。
这里面涉及到了GET/POST方法。
废话不多说直接上代码
##下面是.h文件的内容:
代理回调协议方法
@protocol LiynNetDelegate
- (void)netFinsh:(id)object;
- (void)netError:(id)errorMsg;
@end
这里只有一个属性delegate,用于建立代理关系;
这里向外暴露了五个方法,其中第一个类方法用来初始化一个网络请求类的实例化对象,这个对象是一个单例对象,因为网络请求对象,不存储数据,只作为一个单纯的工具类,所以这个对象只需要存在一个就可以。
@interface LiynNet : NSObject
@property (nonatomic, weak) id delegate;
#pragma mark: method
+ (LiynNet *)defaultNet;
- (void)uploadPOST:(NSString *)URLString Parameters:(id)parameters UploadDictionary:(NSDictionary*)uploadInfo;
- (void)POST:(NSString *)URLString Parameters:(id)parameters;
- (void)GET:(NSString *)URLString Parameters:(id)parameters;
- (void)GETPic:(NSString *)URLString Parameters:(id)parameters Path:(NSString *)path;
@end
##下面是.m文件的内容
创建单例对象
+(LiynNet *)defaultNet{
static LiynNet *net = nil;
if (net == nil) {
net = [[LiynNet alloc] init];
net.manager = [AFHTTPSessionManager manager];
net.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
}
return net;
}
##以下是网络请求
在这里我就想了定制,因为有时候需要判断返回数据的类型,例如:当一个页面进行多种数据请求时,代理方法只有一个,那么我们就需要一个标记变量来区别这次返回的数据类型是什么。
所以这里的parameters字典里需要一个字段msgType来区别。
###一般POST下载请求
- (void)POST:(NSString *)URLString Parameters:(id)parameters{
NSString *msgType = parameters[@"msgType"];
NSLog(@"{\nmethod:POST \nURL:%@ \nParameters:%@",URLString,parameters);
[self.manager POST:URLString parameters:parameters[@"msg"] progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
[self success:@{@"msgType":msgType,@"msg":responseObject}];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self failure:@{@"msgType":msgType,@"error":error}];
}];
}
###一般的GET下载请求
- (void)GET:(NSString *)URLString Parameters:(id)parameters{
NSString *msgType = parameters[@"msgType"];
NSLog(@"method:GET URL:%@ Parameters:%@",URLString,parameters);
[self.manager GET:URLString parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
[self success:responseObject];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self failure:@{@"msgType":msgType,@"error":error}];
}];
}
###一般的POST上传请求
注意上传的字段是服务器给定的,传入的字典uploadInfo内@"uploadParameter"对应的值。
- (void)uploadPOST:(NSString *)URLString Parameters:(id)parameters UploadDictionary:(NSDictionary*)uploadInfo{
NSString *msgType = parameters[@"msgType"];
NSLog(@"{\nmethod:POST \nURL:%@ \nParametersCid:%@",URLString,parameters[@"msg"]);
NSDictionary *dict = parameters[@"msg"];
[self.manager POST: URLString parameters:dict constructingBodyWithBlock:^(id _Nonnull formData) {
NSData *rightData = UIImageJPEGRepresentation(uploadInfo[@"image"], 0.7);
[formData appendPartWithFileData:rightData
name: uploadInfo[@"uploadParameter"]
fileName:@"IDRight.png"
mimeType:@"image/jpeg"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"%f",1.0 * uploadProgress.completedUnitCount/uploadProgress.totalUnitCount);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject
options:NSJSONReadingMutableContainers
error:nil];
[self success:@{@"msgType":msgType,@"msg":dict}];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self failure:@{@"msgType":msgType,@"error":error}];
}];
}
###两个私有方法
####请求数据成功
- (void)success:(id)responseObject{
if (_delegate && [_delegate respondsToSelector:@selector(netFinsh:)]) {
[_delegate netFinsh:responseObject];
}
}
####请求数据失败
- (void)failure:(id)error{
if (_delegate && [_delegate respondsToSelector:@selector(netError:)]) {
[_delegate netError:error];
}
}
这个类是基于AFNetworking的,所以在使用的时候必须要先倒入AFNetworking的第三方库,建议使用CocoaPods来导入,如果有人不会使用的可以自行百度。
pod 'AFNetworking', '~> 3.1.0'
首先在使用的类里遵循协议
声明一个全局的LiynNet类的对象(这个全局只是建议 不全局也可以)
{
LiynNet *_net;
}
或者定义一个属性
@property (nonatomic, strong) LiynNet *net;
实例化这个LiynNet对象并建立代理关系
#pragma mark - 懒加载
-(LiynNet *)net{
if (_net == nil) {
_net = [LiynNet defaultNet];
_net.delegate = self;
}
return _net;
}
###实现协议的方法
在这里你就可以操作返回的数据了
- (void)netFinsh:(id)object{
NSLog(@"msgType %@\n msg %@",object[@"msgType"],object[@"msg"]);
}
这里你就需要慢慢查找原因了
- (void)netError:(id)errorMsg{
NSLog(@"msgType %@\n msg %@", errorMsg[@"msgType"], errorMsg[@"msg"]);
}