您的位置:首页 > 其它

AFN 源码解析和内部实现1

2016-04-12 18:22 387 查看
AFN的基本使用在此就不在多说了,先上代码,我自己对AFN的二次封装,只考虑了对http请求的封装, 后面我会写一篇文章专门对webservice的soap封装,

//

// JKAFNetTool.h

// JKqyApp

//

// Created by dllo on 15/12/15.

// Copyright © 2015年 dllo. All rights reserved.

//

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSUInteger, JKresponseStyle) {

JKJSON,

JKXMl,

JkDATA,

};

typedef NS_ENUM(NSUInteger, JKrequestStyle) {

JKrequestJSON,

JKrequestString,

};

@interface JKAFNetTool :
NSObject

/**

* Post请求

*

* @param url 请求网址

* @param body body体

* @param requestStyle 请求数据类型

* @param headFile 请求头

* @param responseStyle 返回数据类型

* @param success 请求成功回调

* @param failure 请求失败回调

*/

+ (void)PostNetWithURL:(NSString *)url

body:(id)body

bodyStyle:(JKrequestStyle)requestStyle

headFile:(NSDictionary *)headFile

responseStyle:(JKresponseStyle)responseStyle

success:(void (^)(NSURLSessionDataTask *task,
id responseObject))success

failure:(void (^)(NSURLSessionDataTask *task,
NSError *error))failure;

/**

* get请求

*

* @param url 请求网址

* @param body body体

* @param headFile 请求头

* @param responseStyle 返回数据类型

* @param success 请求成功回调

* @param failure 请求失败回调

*/

+ (void)getNetWithURL:(NSString *)url body:(id)body headFile:(NSDictionary *)headFile responseStyle:(JKresponseStyle)responseStyle
success:(void (^)(NSURLSessionDataTask *task,
id responseObject))success

failure:(void (^)(NSURLSessionDataTask *task,
NSError *error))failure;

@end

//

// JKAFNetTool.m

// JKqyApp

//

// Created by dllo on 15/12/15.

// Copyright © 2015年 dllo. All rights reserved.

//

#import "JKAFNetTool.h"

#import "AFNetworking.h"

@implementation JKAFNetTool

+ (void)getNetWithURL:(NSString *)url

body:(id)body

headFile:(NSDictionary *)headFile

responseStyle:(JKresponseStyle)responseStyle

success:(void (^)(NSURLSessionDataTask *task,
id responseObject))success

failure:(void (^)(NSURLSessionDataTask *task,
NSError *error))failure

{

//1, 创建网络管理者

AFHTTPSessionManager *manager = [AFHTTPSessionManager
manager];

//2, 请求头的添加

if (headFile) {

for (NSString *key
in headFile.allKeys) {

[manager.requestSerializer
setValue:headFile[key] forHTTPHeaderField:key];

}

}

//3, 返回数据的类型

switch (responseStyle) {

case JKJSON:

manager.responseSerializer = [AFJSONResponseSerializer
serializer];

break;

case JKXMl:

manager.responseSerializer = [AFXMLParserResponseSerializer
serializer];

break;

case JkDATA:

manager.responseSerializer = [AFHTTPResponseSerializer
serializer];

break;

default:

break;

}

//4. 响应返回数据类型

[manager.responseSerializer
setAcceptableContentTypes:[NSSet
setWithObjects:@"application/json",
@"text/json", @"text/javascript",@"text/html",@"text/css",@"text/plain",
@"application/javascript",@"application/x-javascript",@"image/jpeg",
nil]];

//5. 转码

url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet
URLQueryAllowedCharacterSet]];

//6. 发送请求

[manager GET:url
parameters:body success:^(NSURLSessionDataTask *
_Nonnull task, id
_Nonnull responseObject) {

NSString *path = [NSString
stringWithFormat:@"%ld.plist", [url
hash]];

// 存储的沙盒路径

NSString *path_doc = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
NSUserDomainMask, YES)
lastObject];

// 归档

[NSKeyedArchiver
archiveRootObject:responseObject toFile:[path_doc
stringByAppendingPathComponent:path]];

if (responseObject) {

success(task,responseObject);

}

} failure:^(NSURLSessionDataTask *
_Nonnull task, NSError *
_Nonnull error) {

// 缓存的文件夹

NSString *path = [NSString
stringWithFormat:@"%ld.plist", [url
hash]];

NSString *path_doc = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
NSUserDomainMask, YES)
lastObject];

// 反归档

id result = [NSKeyedUnarchiver
unarchiveObjectWithFile:[path_doc stringByAppendingPathComponent:path]];

if (result) {

success(task, result);

// failure(task, error);

// NSLog(@"%@", error);

} else {

failure(task, error);

}

}];

}

+ (void)PostNetWithURL:(NSString *)url

body:(id)body

bodyStyle:(JKrequestStyle)requestStyle

headFile:(NSDictionary *)headFile

responseStyle:(JKresponseStyle)responseStyle

success:(void (^)(NSURLSessionDataTask *task,
id responseObject))success

failure:(void (^)(NSURLSessionDataTask *task,
NSError *error))failure

{

//1, 创建网络管理者

AFHTTPSessionManager *manager = [AFHTTPSessionManager
manager];

//2 .body的类型

switch (requestStyle) {

case
JKrequestJSON:

manager.requestSerializer = [AFJSONRequestSerializer
serializer];

break;

case
JKrequestString:

[manager.requestSerializer
setQueryStringSerializationWithBlock:^NSString *
_Nonnull(NSURLRequest *
_Nonnull request,
id _Nonnull parameters,
NSError * _Nullable *
_Nullable error) {

return parameters;

}];

break;

default:

break;

}

//3, 请求头的添加

if (headFile) {

for (NSString *key
in headFile.allKeys) {

[manager.requestSerializer
setValue:headFile[key] forHTTPHeaderField:key];

}

}

//4, 返回数据的类型

switch (responseStyle) {

case JKJSON:

manager.responseSerializer = [AFJSONResponseSerializer
serializer];

break;

case JKXMl:

manager.responseSerializer = [AFXMLParserResponseSerializer
serializer];

break;

case JkDATA:

manager.responseSerializer = [AFHTTPResponseSerializer
serializer];

break;

default:

break;

}

//5. 响应返回数据类型

[manager.responseSerializer
setAcceptableContentTypes:[NSSet
setWithObjects:@"application/json",
@"text/json", @"text/javascript",@"text/html",@"text/css",@"text/plain",
@"application/javascript",@"application/x-javascript",@"image/jpeg",
nil]];

//6. 转码

url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet
URLQueryAllowedCharacterSet]];

//7. 发送请求

[manager POST:url
parameters:body success:^(NSURLSessionDataTask *
_Nonnull task, id
_Nonnull responseObject) {

if (requestStyle) {

success(task,responseObject);

}

} failure:^(NSURLSessionDataTask *
_Nonnull task, NSError *
_Nonnull error) {

if (error) {

failure (task,error);

NSLog(@"%@",error);

}

}];

}

写的不好,大家看看就行

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: