ios开发如何封装AFN第三方类库中的http请求
来源:互联网 发布:云数据一体机能贷款吗 编辑:程序博客网 时间:2024/05/16 19:42
在ios开发中,http请求是必不可少的部分,当然苹果自带的http请求可能有些繁琐,于是就诞生了很多的第三方类库,其中afn不可不说是一个不错的选择。有时候,afn更新的时候,可能会修改一些方法的名字,或者逻辑,那么对于开发者来说,不更新afn,直接用原来的还好说,如果一旦我们也用新的afn,那么我们就不得不一个一个页面的去修改里面的方法了,很痛苦。所以如果我们对第三方类库afn再进行一次封装就好了。下次,afn更新时,我们只需要修改一下我们封装的方法就可以了。
首先,我们先看一下afn最新的两个post请求和一个get请求方法:
//get请求- (AFHTTPRequestOperation *)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure{ AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"GET" URLString:URLString parameters:parameters success:success failure:failure]; [self.operationQueue addOperation:operation]; return operation;}//post请求,不包含上传文件等东西- (AFHTTPRequestOperation *)POST:(NSString *)URLString parameters:(id)parameters success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure{ AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"POST" URLString:URLString parameters:parameters success:success failure:failure]; [self.operationQueue addOperation:operation]; return operation;}//post请求,可以上传文件等东西- (AFHTTPRequestOperation *)POST:(NSString *)URLString parameters:(id)parameters constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure{ NSError *serializationError = nil; NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError]; if (serializationError) { if (failure) {#pragma clang diagnostic push#pragma clang diagnostic ignored "-Wgnu" dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ failure(nil, serializationError); });#pragma clang diagnostic pop } return nil; } AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; [self.operationQueue addOperation:operation]; return operation;}
然后我们看一下如何使用这三个方法
//get请求,无请求参数的情况下//创建请求管理类AFHTTPRequestOperationManager*mager=[AFHTTPRequestOperationManager manager]; //mager.responseSerializer = [AFJSONResponseSerializer serializer];//申明返回的结果是json类型 //mager.requestSerializer=[AFJSONRequestSerializer serializer];//申明请求的数据是json类型 //[mager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];//往头部添加一些信息 //[mager.requestSerializer setValue:token forHTTPHeaderField:@"token"];//往头部添加一些信息 NSString *strurl=@"服务器给的地址"; [mager GET:strurl parameters:nil success:^(AFHTTPRequestOperation * operation, id responseObject) { //请求数据成功处理,返回结果在responseObject里面 NSLog(@"查看一下responseObject的类型-----%@",[responseObject class]); NSLog(@"查看一下responseObject的内容-----%@",responseObject); } failure:^(AFHTTPRequestOperation * operation, NSError * error) { //请求数据失败处理 }];//post请求 有请求参数的情况下 NSMutableDictionary *parameters=[NSMutableDictionary dictionary]; parameters[@"phone_number"]=self.phonetextfield.text; parameters[@"validate_number"]=self.checktextfield.text; AFHTTPRequestOperationManager*mager=[AFHTTPRequestOperationManager manager]; NSString *strurl=@"服务器给的地址"; [mager POST:strurl parameters:parameters success:^(AFHTTPRequestOperation * operation, id responseObject) { //请求数据成功处理 } failure:^(AFHTTPRequestOperation * operation, NSError * error) { //请求数据失败处理 }];//post请求,无参数传入图片情况下 AFHTTPRequestOperationManager*mager=[AFHTTPRequestOperationManager manager]; [mager POST:url parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { UIImageView *imageview1=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"tupian1.png"]]; UIImageView *imageview2=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"tupian2.png"]]; NSData *data1=UIImageJPEGRepresentation(imageview1.image, 1.0);//压缩图片比例1:1。 [formData appendPartWithFileData:data1 name:@"pic" fileName:@"" mimeType:@"image/jpeg"]; NSData *data2=UIImageJPEGRepresentation(imageview2.image, 0.5);//压缩图片比例1:2。 [formData appendPartWithFileData:data2 name:@"pic" fileName:@"" mimeType:@"image/jpeg"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { //请求数据成功处理 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //请求数据失败处理 }];
接下来,我们开始对这三个方法进行封装
首先创建一个继承uiview的类。导入afn头文件
然后依照afn的方法名,我们也创建一个方法
#import <UIKit/UIKit.h>@interface JSCHttpTool : UIView+(void)Post:(NSString *)url parameters:(NSDictionary *)parameters success:(void(^)(id json))success failure:(void(^)(NSError *error))failure;@end
实现里面
#import "JSCHttpTool.h"#import "AFNetworking.h"@implementation JSCHttpTool//实现里面一定要手打这个方法,根据提示敲出来。因为这个里面和定义里面不完全一样。 定义里面有个id josn 在实现里面,默认是没有的+(void)POST:(NSString *)url parameters:(NSDictionary *)parameters success:(void (^)(id))success failure:(void (^)(NSError *))failure{ AFHTTPRequestOperationManager*mager=[AFHTTPRequestOperationManager manager]; [mager POST:url parameters:parameters success:^(AFHTTPRequestOperation * operation, id responseObject) { if (success) { success(responseObject); } } failure:^(AFHTTPRequestOperation * operation, NSError * error) { if (failure) { failure(error); } }];}@end
解释一下,这个方法中的第一个success是和这个方法一起组合的方法名中的一部分,第二个success则是block方法名
(void(^)(id json))success
这个代表,定义一个block,方法名是success,void是没有返回值,而传入参数是id类型的 josn是参数名
ps:block不会的同学请自行脑补
这里我们调用afn,然后
if (success) { success(responseObject); }
这句代码,表示,如果使用页面中success这个block存在,则回使用页面中的success block方法,传入afn返回的数据responseObject。
ok,我们在使用页面先试用一下,在使用页面导入我们的JSCHttpTool头文件
NSString *strurl=@"服务器给的地址"; [JSCHttpTool Post:@"" parameters:parameters success:^(id json) { //请求数据成功处理,返回结果在responseObject里面 NSLog(@"查看一下responseObject的类型-----%@",[responseObject class]); NSLog(@"查看一下responseObject的内容-----%@",responseObject); } failure:^(NSError *error) { //请求数据失败处理 }];
ok了,以后,afn如果更改这个方法了,我们只需要更改我们的JSCHttpTool就可以了。
接下来,依次,我们把别的两个方法也封装进来。
+(void)GET:(NSString *)url parameters:(NSDictionary *)parameters success:(void (^)(id))success failure:(void (^)(NSError *))failure{ AFHTTPRequestOperationManager *mager =[AFHTTPRequestOperationManager manager]; [mager GET:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { if (success) { success(responseObject); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (failure) { failure(error); } }];}+(void)POST:(NSString *)url parameters:(id)parameters constructingBodyWithBlock:(NSArray *(^)(void))block success:(void (^)(id))success failure:(void (^)(NSError *))failure{ AFHTTPRequestOperationManager *mager =[AFHTTPRequestOperationManager manager]; [mager POST:url parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { if (block) { NSArray *dataarray= block(); for (NSData *data in dataarray) { [formData appendPartWithFileData:data name:@"pic" fileName:@"" mimeType:@"image/jpeg"]; } } } success:^(AFHTTPRequestOperation *operation, id responseObject) { if (success) { success(responseObject); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (failure) { failure(error); } }];}
其中,如果不是很理解的人,我再说一下我的这个post请求在有传入文件的这个情况下使用方法:
NSString *strurl=@"服务器给的地址"; [JSCttpTool Post:strurl parameters:parameters constructingBodyWithBlock:^NSArray *{ NSMutableArray *dataarray=[NSMutableArray array]; UIImageView *imageview1=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"tupian1.png"]]; UIImageView *imageview2=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"tupian2.png"]]; NSData *data1=UIImageJPEGRepresentation(imageview1.image, 1.0); [dataarray addObject:data1]; NSData *data2=UIImageJPEGRepresentation(imageview2.image, 0.5); [dataarray addObject:data2]; return dataarray; } success:^(id json) { //请求数据成功处理 } failure:^(NSError *error) { //请求数据成功处理 }];
OK!搞定!
- ios开发如何封装AFN第三方类库中的http请求
- ios-Swift中封装AFN中的GET和POST请求
- 封装AFN请求
- iOS开发 AFN配置https请求
- iOS开发 AFN配置https请求
- iOS AFN 封装POST网络请求(AFURLSessionManager)
- iOS - 简述二次封装AFN,设置请求头,https安全策略
- iOS AFN 封装数据
- iOS AFN AFNWorking3封装
- iOS 之AFN封装
- iOS开发总结之block回调以AFN为基础封装的网络请求操作类
- ios-OC封装AFN中的GET和POST方法
- angular中的http请求封装
- iOS开发之使用信号量实现AFN请求同步
- iOS开发之使用信号量实现AFN请求同步
- iOS AFN的再次封装
- iOS AFN的二次封装
- iOS开发之AFN
- 装饰者模式
- 二进制位运算
- 解决Wget下载时的乱码问题
- Gulp混淆压缩代码
- 服务器端极光推送2种方式
- ios开发如何封装AFN第三方类库中的http请求
- 仿照微信首页下拉拍照的demo
- java 读写文件
- Android 基础UI Demo小合集
- 前言
- iOS开发-使用Storyboard进行界面跳转及传值
- DLL生成与使用
- maven中配置本地仓库和远程仓库(私服)
- svn版本库迁移