2016也即将过去,距iPhone4发布已经六年有余,期间iOS也有了很大的更新,在学习iOS的过程中,我们应该也收获了很多,也付出了许多。今天在这儿,我就简单的为大家解析一下关于iOS网络请求的一些事。
对于大部分APP来说,网络请求都是相当重要的,因为在大多数情况下,我们的产品都需要一定程度的网络交互,并以此获取到用户的响应信息,引导用户完成一些网络操作,如最简单的登录注册,以及后续的聊天支付等等。网络请求也有很多种,如http,Https,TCP,UDP协议等等,当然现阶段我使用的最多的还是http与https。
关于http请求,在iOS开发中,使用得较多的是AFNetworking,经过对NSURLRquest高度封装,使得网络请求变的相对简单清晰。通常我们对于处理过后的网络数据会选择建模取值,使数据逻辑变得更清晰,减少页面内的数据判断,提高程序的容错率。建模的话使用的较多的是MJExtension和JSONModel、Mantle等框架,对于框架复杂度的话,大致为MJExtension>JSONModel>Mantle,当然这三者也都有自己的优缺点,就需要大家在实践中去。当然如果网络请求不太复杂,后端逻辑教为严谨的话,我们也可以暂时性的通过对AF简单整理完成此次网络请求,下面我就将POST,GET以及图片上传简单整理如下:
+(void)POSTWithCompleteURL:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *,id))success
failure:(void (^)(NSURLSessionDataTask *,NSError *))failure{
AFHTTPSessionManager * session = [AFHTTPSessionManagermanager];
session.requestSerializer.timeoutInterval =15.f;
session.responseSerializer.acceptableContentTypes = [NSSetsetWithObjects:@"application/json",@"application/xml",@"text/json",@"text/javascript",@"text/html",@"text/plain",nil];
[session POST:URLStringparameters:parameters progress:^(NSProgress *_Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
success (task,responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
SHOWERROR
failure (task,error);
}];
}
+(void)GETWithCompleteURL:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *operation,id responseObject))success
failure:(void (^)(NSURLSessionDataTask *operation,NSError *error))failure{
AFHTTPSessionManager * session = [AFHTTPSessionManagermanager];
session.responseSerializer.acceptableContentTypes = [NSSetsetWithObjects:@"application/json",@"application/xml",@"text/json",@"text/javascript",@"text/html",@"text/plain",nil];
[session GET:URLStringparameters:parameters progress:^(NSProgress *_Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
success (task,responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
failure (task,error);
}];
}
+(void)NOJSONPOSTWithCompleteURL:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *operation,id responseObject))success
failure:(void (^)(NSURLSessionDataTask *operation,NSError *error))failure{
AFHTTPSessionManager * session = [AFHTTPSessionManagermanager];
session.responseSerializer.acceptableContentTypes = [NSSetsetWithObjects:@"application/json",@"application/xml",@"text/json",@"text/javascript",@"text/html",@"text/plain",nil];
session.responseSerializer = [AFHTTPResponseSerializerserializer];
[session POST:URLStringparameters:parameters progress:^(NSProgress *_Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
success (task,responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
SHOWERROR
failure (task,error);
}];
}
+(void)XXXXPOSTWithCompleteURL:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *operation,id responseObject))success
failure:(void (^)(NSURLSessionDataTask *operation,NSError *error))failure{
AFHTTPSessionManager * session = [AFHTTPSessionManagermanager];
session.responseSerializer.acceptableContentTypes = [NSSetsetWithObjects:@"application/json",@"application/xml",@"text/json",@"text/javascript",@"text/html",@"text/plain",nil];
session.responseSerializer=[AFHTTPResponseSerializerserializer];
[session POST:URLStringparameters:parameters progress:^(NSProgress *_Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
success (task,responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
SHOWERROR
failure (task,error);
}];
}
/**
* 上传图片数组
*
* @param imgArr 图片image数组
* @param URLString 接口方法
* @param parameters 参数
* @param success
* @param failure
*/
+(void)POSTImagesWithImgUrlArr:(NSArray *)imgArr
CompleteURL:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *operation,id responseObject))success
failure:(void (^)(NSURLSessionDataTask *operation,NSError *error))failure {
AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];
manager.responseSerializer.acceptableContentTypes = [NSSetsetWithObjects:@"application/json",@"application/xml",@"text/json",@"text/javascript",@"text/html",@"text/plain",nil];
manager.responseSerializer = [AFHTTPResponseSerializerserializer];
[manager POST:URLStringparameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
for (int i =0; i < imgArr.count; i ++) {
UIImage * img = imgArr[i];
NSURL * urlPath = [UserNetworkingsaveImage:img withName:@"file.jpg"];
[formData appendPartWithFileURL:urlPathname:@"file"error:nil];
}
} progress:^(NSProgress *_Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
if ([responseObjectisKindOfClass:[NSDataclass]]) {
NSData *doubi = responseObject;
NSDictionary * dataDic = [NSJSONSerializationJSONObjectWithData:doubioptions:NSJSONReadingAllowFragmentserror:nil];
success (task,dataDic);
}else{
SHOWERROR
}
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
SHOWERROR
failure (task,error);
}];
}
+ (void)loginWithMobile:(NSString *)mobile
password:(NSString *)password
fromlocal:(NSString *)fromlocal
address:(NSString *)address
block:(void (^)(id objc,BOOL success))block;
{
NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
[dic setValue:mobile forKey:@"mobile"];
[dic setValue:@2 forKey:@"fromlocal"];
[dic setValue:password forKey:@"password"];
[dic setValue:address forKey:@"address"];
[dic setValue:nowVersion forKey:@"version"];
[dic setValue:@2 forKey:@"type"];
[UserNetworking POSTWithCompleteURL:BASE_URLWith(@"app/login") parameters:dic success:^(NSURLSessionDataTask *operation,id responseObject) {
block (responseObject,YES);
} failure:^(NSURLSessionDataTask *operation, NSError *error) {
block (error.localizedDescription,NO);
}];
+ (void)uploadImagesWithImgArr:(NSArray *)imgArr
block:(void (^)(id objc,BOOL success))block{
if (imgArr.count ==0) {
block(nil,NO);
return;
}
NSMutableDictionary *dic = [[NSMutableDictionaryalloc] init];
[dic setValue:USERIDforKey:@"userid"];
[dic setValue:nowVersionforKey:@"version"];
[dic setValue:@2forKey:@"type"];
[UserNetworkingPOSTImagesWithImgUrlArr:imgArrCompleteURL:BASE_URLWith(@"app/ajaxFileUpload")parameters:dic success:^(NSURLSessionDataTask *operation,id responseObject) {
block (responseObject,YES);
} failure:^(NSURLSessionDataTask *operation,NSError *error) {
block (error.localizedDescription,NO);
}];
}
其实图片上传与普通网络请求相差不多,只是对于图片要做小细节的处理,然后传入相应的参数就可以获取到所需要的数据值,成功与失败都会获得不同的返回,我们再去对返回值进行处理,展示等。[UserNetworkinggetReadTaskListAndVersion:nowVersionPage:1block:^(id objc,BOOL success)
{
NSLog(@"%@",objc);
if (success && objc) {
if ([objc[@"result"]integerValue] && ![objc[@"data"]isKindOfClass:[NSNullclass]] )
{
if ( ![objc[@"data1"]isKindOfClass:[NSNullclass]]) {
_helpArray = [NSMutableArrayarray];
[_helpArrayaddObjectsFromArray:objc[@"data1"]];
}
[weakSelf dataProcess:objc];
} else
{
[BaseMethodshowError:objc[@"errmsg"]];
}
// 刷新轮播图
[weakSelf getScrollViewData];
}
}];