(十)网络请求的基本封装
2017-11-23 16:55
495 查看
网络请求的封装
设置开发环境与生产环境的地址开关,结合AFNetworking进行封装,我直接用我以前实现的代码先大致说明下实现后的效果。上图的简单流程便是,根据返回后的数据是array类型还是一个字典类型来选择不同的方法
请求的地址
上传服务器时和服务器方协定的一些加密请求规则,这个根据公司情况决定是否要添加,我后面举例就暂时不添加了。
上传服务器需要传递的参数
获得的服务器数据转换为的model类型
将转化的model数据指向本地的一个对应属性
完成网络请求成功或失败的操作
现在我通过新浪的一个ip地址信息查询接口来进行下演示。
http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255
以此接口我们设定服务器方给我们的基本地址是http://int.dpool.sina.com.cn,这个地址是生产环境的,如果需要改为开发环境也就是说只改这个地址即可,后面跟着的地址参数等无需变动
iplookup/iplookup.php可作为请求数据的地址参数
format=json&ip=218.4.255.255 可作为请求的两个参数
所以我们先简单实现.h文件的设置
#import <Foundation/Foundation.h> #import "AFNetworking.h" #import "BaseModel.h" @interface WebServiceHelper : NSObject //新浪的ip获取地址 //http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255 // 0 - 正式服 1 - 测试服 #define DEBUGMODE 0 #if DEBUGMODE #define kHTTPREQUEST_BASE_URL @"http://int.dpool.sina.com.cn"//测试环境 #else #define kHTTPREQUEST_BASE_URL @"http://int.dpool.sina.com.cn"//生成环境网络请求 #endif #pragma mark --------------------------------返回带有对象控制权的model数据--------------- /** * 请求带有对象控制器的字典Model * * @param url 地址 * @param parameters 上传的参数 * @param modelClass Model类型 * @param requester 对象所有者 * @param key 属性名 * @param success 成功返回字典Model数据 * @param failure 失败 */ + (void)postAndGetJsonModelWithURLString:(NSString *)url parameters:(NSDictionary *)parameters modelClass:(Class)modelClass requester:(id)requester key:(NSString *)key success:(void (^)(BaseModel *baseModel))success failure:(void (^)(NSError *error))failure; @end
关于.m的实现我就不一一解释了,详情看代码
#import "WebServiceHelper.h" #define CustomErrorDomain @"com.WebServiceHelper" typedef enum { PARAMETER_ERROR = 0,//参数错误 EXCEPTION_DESCRIPTION, //网络错误 INTERFACE_CHECKFAIL,//接口验证失败 BC_CODEFAIL//渠道码不存在 }CustomErrorFailed;// 用于表示错误类型 @implementation WebServiceHelper #pragma mark 请求最基本数据 +(void)postWithURLString:(NSString *)url parameters:(NSDictionary *)parameters success:(void (^)(id))success failure:(void (^)(NSError *))failure { NSString *postUrl = [NSString stringWithFormat:@"%@/%@",kHTTPREQUEST_BASE_URL,url]; //需要提交的参数(原参数加加密验证的数据) AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"]; manager.requestSerializer.timeoutInterval = 30; //因为这个测试的地址需要用GET方法获取,所以这里我先用GET的方法调用了 [manager GET:postUrl parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (success) { success(responseObject); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failure) { failure(error); } }]; } #pragma mark ------------------------------请求model数据-------------------------- #pragma mark 请求model数据 + (void)postAndGetJsonModelWithURLString:(NSString *)url parameters:(NSDictionary *)parameters modelClass:(Class)modelClass success:(void (^)(BaseModel *baseModel))success failure:(void (^)(NSError *error))failure { // 检查需要返回的model类型是否存在 if (modelClass == nil) { if (failure != nil) { NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"is a parameter error" forKey:NSLocalizedDescriptionKey]; NSError *aError = [NSError errorWithDomain:CustomErrorDomain code:PARAMETER_ERROR userInfo:userInfo]; failure(aError); NSLog(@"\n\nmodelClass参数 == nil\n\n"); } return ; } [WebServiceHelper postWithURLString:url parameters:parameters success:^(id responseObject) { // 检查data if (![responseObject isKindOfClass:[NSDictionary class]]) { NSLog(@"\n\njsonModelRequestWithInfo请求的数据不是字典类型: data is invalid\n\n"); NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"数据不是字典类型" forKey:NSLocalizedDescriptionKey]; NSError *aError = [NSError errorWithDomain:CustomErrorDomain code:PARAMETER_ERROR userInfo:userInfo]; failure(aError); } else { // 正常返回 BaseModel *baseModel = [[modelClass alloc] initWit c1dc hDataDic:responseObject]; if (success != nil) { success(baseModel); } } } failure:^(NSError *error) { failure(error); }]; } #pragma mark ------------------------------请求有对象所有选的model数据-------------------------- #pragma mark 请求有对象所有选的model数据 + (void)postAndGetJsonModelWithURLString:(NSString *)url parameters:(NSDictionary *)parameters modelClass:(Class)modelClass requester:(id)requester key:(NSString *)key success:(void (^)(BaseModel *baseModel))success failure:(void (^)(NSError *error))failure { // 检查实参 if (requester == nil || key == nil) { if (failure != nil) { NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"请求的参数requester == nil, or key ==nil" forKey:NSLocalizedDescriptionKey]; NSError *aError = [NSError errorWithDomain:CustomErrorDomain code:PARAMETER_ERROR userInfo:userInfo]; failure(aError); } return ; } [WebServiceHelper postAndGetJsonModelWithURLString:url parameters:parameters modelClass:modelClass success:^(BaseModel *baseModel) { //kvo设置属性值 [requester setValue:baseModel forKey:key]; if (success != nil) { success(baseModel); } } failure:^(NSError *error) { if (error != nil) { // //如果网络请求失败,则调用一下pageNum的值减1,防止pullUp失败时也会让pageNum加1 // if ([requester isKindOfClass:[BaseViewController class]]) { // [requester reducePageNum]; // } failure(error); } }]; } @end
实现网络请求
第一创建对应的model为FriendIPModelmodel数据中添加返回数据的所有属性
在控制器中添加一个FriendIPModel的对象属性
开始网络请求
#import "FriendViewController.h" #import "FriendIPModel.h" @interface FriendViewController () @property (nonatomic,strong)FriendIPModel *friendModel; @property (weak, nonatomic) IBOutlet UITextField *textFied; @property (weak, nonatomic) IBOutlet UITextView *containTextV; @end @implementation FriendViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.title = @"好友"; } #pragma mark ---------Actions-------- - (IBAction)resetAction { self.textFied.text = @"53.223.108.40"; self.containTextV.text = @""; [self.textFied resignFirstResponder]; } - (IBAction)searcheAction { [self requestData]; self.containTextV.text = @""; [self.textFied resignFirstResponder]; } #pragma mark 请求网路 - (void)requestData { [super requestData]; NSMutableDictionary *muDic = [NSMutableDictionary dictionary]; [muDic setObject:self.textFied.text forKey:@"ip"]; [muDic setObject:@"json" forKey:@"format"]; //key值必须和上面定义的属性名一致 [WebServiceHelper postAndGetJsonModelWithURLString:@"iplookup/iplookup.php" parameters:muDic modelClass:[FriendIPModel class] requester:self key:@"friendModel" success:^(BaseModel *baseModel) { [self requestSuccess]; self.containTextV.text = self.friendModel.country; } failure:^(NSError *error) { self.isLoading = NO; self.containTextV.text = @"请求数据错误"; }]; }
相关文章推荐
- 微信小程序基本的开发框架抽取,包括网络请求的二次封装,页面状态管理,常见页面模板封装
- android http——网络请求二次封装的框架设计
- 网络请求的基本知识《极客学院 --AFNetworking 2.x 网络解析详解--1》学习笔记
- MVP操作RecyclerView多条目SpringView,OKHttp封装请求网络
- 项目中对网络请求的封装,加入了全局缓存机制
- swift网络请求封装
- 对iOS网络请求的容易封装,并且使用block回调函数方式
- React Native 网络请求封装:使用Promise封装fetch请求
- 我的第一个flutter demo 顶部导航栏加网络请求的基本使用
- Retrofit网络请求框架的基本使用
- HttpURLConnection 单独封装网络请求工具类
- Android网络请求框架----Okhttp3完全解析(2),封装框架
- (iOS-框架封装)AFN3.x 网络请求封装
- Android知识点之网络底层封装:细数常用的网络请求框架
- 源码推荐(01.04B):基于AFNetworking3.0的网络请求封装,iOS仿苹果健康折线图
- MVP+Retrofit封装网络请求
- 自己动手写一个 iOS 网络请求库(NSURLSession 初探、封装接口、降低耦合、快速文件上传 )
- 自己动手写一个 iOS 网络请求库——封装接口
- [绍棠_Swift] Swift3.0中的Alamofire网络请求的封装
- 微信小程序网络请求封装