您的位置:首页 > 理论基础 > 计算机网络

[置顶] 对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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐