(十)网络请求的基本封装
来源:互联网 发布:数据切片器 编辑:程序博客网 时间:2024/05/16 00:28
网络请求的封装
设置开发环境与生产环境的地址开关,结合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] initWithDataDic: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为FriendIPModel
model数据中添加返回数据的所有属性
- 在控制器中添加一个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 = @"请求数据错误"; }];}
阅读全文
0 0
- (十)网络请求的基本封装
- 网络请求的封装
- 封装的网络请求
- 网络请求的封装
- 网络请求的封装
- 网络请求的封装方法
- 各种网络请求的封装
- HttpURLConnection网络请求的封装
- Xutils3网络请求的封装
- Xutils3网络请求的封装
- 封装OkHttp的网络请求
- 微信小程序基本的开发框架抽取,包括网络请求的二次封装,页面状态管理,常见页面模板封装
- OKHttp基本的网络请求
- 常见的Android 网络请求的封装;
- 使用NSURLConnection的网络请求与封装
- MKNetworkKit对网络请求的完美封装
- 第三方网络请求的封装
- AFNetworking 2.5.x 网络请求的封装
- Openresty最佳案例 | 第3篇:Openresty的安装
- 全面解读python web 程序的9种部署方式
- 跨线程可能引发的崩溃问题
- VirtualBox内Linux系统怎样与Windows共享文件夹
- cmake Could NOT find ZLIB (missing: ZLIB_LIBRARY)
- (十)网络请求的基本封装
- [Poi2010]Antisymmetry
- sublime text 格式化html css 与显示函数列表
- STM32F103C8T6学习笔记_时钟
- 艰难的抉择,阿里“小前台、大中台”的解读
- vmware虚拟机vmnet0不见了导致桥接失败
- Linux驱动开发】Ubuntu14.04配置tftp服务并与ARM tftp
- 数学笔记24——分部积分
- Openresty最佳案例 | 第4篇:OpenResty常见的api