[置顶] 对AFN 进行进一步封装,再应用于具体的项目,这样可以将业务逻辑代码与网络框架进行解耦
2017-07-11 09:20
666 查看
目的
结合TouchXML 进行封装。将业务功能代码 和第三方库的分离// // Created by devzkn on 05/10/2016. // Copyright © 2016 DevKevin. All rights reserved. // #import <Foundation/Foundation.h> #import "AFNetworking.h" // 封装整个项目的GET\POST请求 #import "HSSingleton.h" #import <Foundation/Foundation.h> #import "CXMLDocument.h" @interface KNHttpTool : NSObject /** // //+ (instancetype)shareCMPAYHttpTool */ HSSingletonH(CMPAYHttpTool); // +(instancetype)share##classname /** * 发送一个POST请求 * * @param url 请求路径 * @param params 请求参数 * @param success 请求成功后的回调 * @param failure 请求失败后的回调 */ + (void)postWithURL:(NSString *)url params:(NSData* )params success:(void (^)(id response))success failure:(void (^)(NSError *error))failure; /** * 发送一个POST请求 * * @param url 请求路径 * @param params 请求参数 * @param success 请求成功,业务返回码也是成功时的回调 * @param RspCDFailed 请求成功,业务返回码是失败时的回调 此block常常是对应各个接口的异常处理 * @param failure 请求失败后的回调 */ + (void)postWithURL:(NSString *)url params:(NSData* )params success:(void (^)(id response))success RspCDFailed:(void (^)(id response))RspCDFailed failure:(void (^)(NSError *error))failure; /** * 发送一个POST请求 * * @param url 请求路径 * @param params 请求参数 * @param success 请求成功,业务返回码也是成功时的回调 ----block传递的参数为CXMLDocument类型 * @param RspCDFailed 请求成功,业务返回码是失败时的回调 此block常常是对应各个接口的异常处理 ---block传递的参数为CXMLDocument类型 * @param failure 请求失败后的回调 */ + (void)postWithURL:(NSString *)url params:(NSData* )params successBlock:(void (^)(CXMLDocument *response))success RspCDFailed:(void (^)(CXMLDocument *response))RspCDFailed failure:(void (^)(NSError *error))failure; /** * 发送一个POST请求(上传文件数据) * * @param url 请求路径 * @param params 请求参数 * @param formData 文件参数 * @param success 请求成功后的回调 * @param failure 请求失败后的回调 */ + (void)postWithURL:(NSString *)url params:(NSDictionary *)params formDataArray:(NSArray *)formDataArray success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure; /** * 发送一个GET请求 * * @param url 请求路径 * @param params 请求参数 * @param success 请求成功后的回调 * @param failure 请求失败后的回调 */ + (void)getWithURL:(NSString *)url params:(NSDictionary *)params success:(void (^)(id response))success failure:(void (^)(NSError *error))failure; @end /** * 用来封装文件数据的模型 */ @interface CMPAYFormData : NSObject /** * 文件数据 */ @property (nonatomic, strong) NSData *data; /** * 参数名 */ @property (nonatomic, copy) NSString *name; /** * 文件名 */ @property (nonatomic, copy) NSString *filename; /** * 文件类型 */ @property (nonatomic, copy) NSString *mimeType; @end
注意事项:
一、 关于post请求的body为XML的二进制数据的问题总结
不管是ASI 还是AFNetwork框架的使用方法,都是采用原生态的请求对象(即自己封装好NSMutableURLRequest 对象直接作为框架对应的API方法的参数)。否则将请求失败,服务器端通常无法识别。
1、ASI的实现代码示例
XML格式的参数进行POST请求// 开始上传 self.request = [ASIHTTPRequest requestWithURL:url]; NSData *myPostData = [strXML dataUsingEncoding:NSUTF8StringEncoding]; NSMutableData *myMutablePostData = [NSMutableData dataWithData:myPostData]; [self.request setPostBody:myMutablePostData]; [self.request setRequestMethod:@"POST"]; [self.request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"]; [self.request addRequestHeader:@"Content-Type" value:@"application/xml"]; self.delegate = delegate; self.request.delegate = self; self.request.didFinishSelector = @selector(requestFinished:); self.request.didFailSelector = @selector(requestFailed:); if ([Session Instance].timeOutSeconds > 0) { self.request.timeOutSeconds = [Session Instance].timeOutSeconds; [Session Instance].timeOutSeconds = 0; } else { self.request.timeOutSeconds = 30; } [self.request startAsynchronous];
AF2.X 使用AFHTTPRequestOperation进行请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; request.HTTPMethod = @"POST"; request.HTTPBody = params; // // AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request]; // [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { // // } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { // // }]; // // [operation start];
AF2.X 使用AFHTTPRequestOperationManager创建HTTPRequestOperation的方式进行请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; request.HTTPMethod = @"POST"; request.HTTPBody = params; AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; // AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager]; mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];//返回数据以xml格式接收 // mgr.requestSerializer = [AFHTTPRequestSerializer serializer]; [mgr.requestSerializer setValue:@"gzip, deflate" forHTTPHeaderField:@"Accept-Encoding"]; //--1.AFHTTPRequestOperation- - start-// // AFHTTPRequestOperation *httpRequestOperation = [mgr HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { // // } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { // // }]; // // [httpRequestOperation start]; //-1.AFHTTPRequestOperation end--//
AF2.使用 AFHTTPSessionManager进行请求
+ (void)postWithURL:(NSString *)url params:(NSData* )params success:(void (^)(id))success failure:(void (^)(NSError *))failure { // 1/封装NSMutableURLRequest NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; request.HTTPMethod = @"POST"; request.HTTPBody = params; // 2/ AFHTTPSessionManager 创建NSURLSessionDataTask AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager]; mgr.responseSerializer = [AFHTTPResponseSerializer serializer];//返回数据以xml格式接收 // mgr.requestSerializer = [AFHTTPRequestSerializer serializer]; [mgr.requestSerializer setValue:@"gzip, deflate" forHTTPHeaderField:@"Accept-Encoding"]; mgr.requestSerializer.timeoutInterval = 30.0; // //3.NSURLSessionDataTask 进行请求 [[mgr dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { NSString * strResponse = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; [PopLoadingDialog dismiss]; NSLog(@"requestFinished"); NSHTTPURLResponse *hTTPURLResponse =(NSHTTPURLResponse*)response; NSLog(@"statusCode: %li", (long)[hTTPURLResponse statusCode]); NSLog(@"response:\n%@", strResponse); if (error == nil) {//请求成功 if (hTTPURLResponse.statusCode == 500) { UIAlertView *av = [[UIAlertView alloc]initWithTitle:@"KN" message:@"系统内部错误" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [av show]; return; } if (success) { success(responseObject); } }else{ //请求失败 if (failure) { failure(error); } } }] resume] ; }
二、 关于静态库中使用的AFN 框架是否添加到静态库工程的问题
1、如果静态库中使用的AFN 框架没有添加到静态库工程的targets,这样能达到编译不报错的目的; 这样就要求使用.a 文件的测试app工程需要将对应的AFN框架文件添加到targets.相关文章推荐
- 对主流框架OKHttp的封装,达到一行代码实现一个业务逻辑
- [置顶] android 软电话 开发包-JNI 封装 SIP 协议,可进行二次开发应用于VOIP
- 初次接触volley网络框架,进行初步封装使用
- 对OO的封装了有了新的理解——希望是普通函数来写总体流程来统管类似的业务,但却又涉及具体操作的函数,仍然可以达到目的
- [置顶] Android 利用APT对网络请求进行极简封装
- 深入浅出学习Struts1框架(二):重构MVC模式代码中跳转路径和业务逻辑
- [置顶] Retrofit2+Rxjava2网络请求框架的封装
- [置顶] 优雅设计封装基于Okhttp3的网络框架(完):原生HttpUrlConnction请求、多线程分发 及 数据转换
- (iOS-框架封装)AFN3.x 网络请求封装
- VBA处理文件框架代码 【第五部分(5.1.1):具体业务处理代码】
- 项目里需要在服务启动时进行一些业务逻辑
- [C#]_[使用NUnit对业务逻辑代码进行单元测试]
- Spring声明式事务管理(主为解耦,与业务代码解耦 与具体事务管理器解耦)
- 深入浅出学习Struts1框架(二):重构MVC模式代码中跳转路径和业务逻辑
- VBA处理文件框架代码 【第五部分(5.1):具体业务】
- WCFRestFull空框架,套上业务逻辑实现就可以用了
- 一个使用方便的对FMDB进行封装的框架和一个可以切应用图标的应用
- android项目后期优化-----代码重新封装/形成框架意识(http请求)
- ######01.业务逻辑分析:首先从页面开始,确定入口和出口页面。然后才是具体代码。
- 基于retrofit的网络框架的终极封装(二)-与retrofit的对接与解耦,以及遇到的坑