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
//
// 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
相关文章推荐
- android基础再学习---如何保证Service不被杀掉
- js数组之稀疏数组和密集数组
- [转]C#调用FFMPEG,并异步读取输出信息的代码
- php页面静态化技术;学习笔记
- nginx + varnish + nginx 获取客户端地址
- 个人代码问题以及总结
- java robots协议检测工具
- Android ListView工作原理完全解析,带你从源码的角度彻底理解
- MongoDB使用小结(二)
- 联合,枚举与typedef
- 备份脚本
- SaltStack常用命令
- MongoDB使用小结(-)
- zookeeper的安装和配置
- string类成员函数的使用方法(三)
- CentOS6.3下GitLab+Nginx(SSL)+MySQL+Ruby安装部署
- c++实验3
- C# 递归算法与冒泡
- json文件中的特殊字符处理,放置json数据读取产生错误
- Ubuntu 14.04安装及使用(添加root用户,与windows共享文件夹)