AFNetworking 2.5.x 网络请求的封装

源码地址

https://github.com/YouXianMing/Networking

说明

1. 将block形式的请求转换成用代理来处理

2. 你可以通过继承父类,改写父类的某些方法来达到转换请求字典(加密或者其他事宜等),转换获取结果的目的(加密或者其他事宜等)

3. 支持下载进度

常规请求源码

//
// Networking.h
// NetworkingCraft
//
// Created by YouXianMing on 15/6/11.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h>
@class Networking; typedef enum : NSUInteger { GET_METHOD, // GET请求
POST_METHOD, // POST请求 } AFNetworkingRequestMethod; typedef enum : NSUInteger { HTTPRequestType = 0x11, // 二进制格式 (不设置的话为默认格式)
JSONRequestType, // JSON方式
PlistRequestType, // 集合文件方式 } AFNetworkingRequestType; typedef enum : NSUInteger { HTTPResponseType = 0x22, // 二进制格式 (不设置的话为默认格式)
JSONResponseType, // JSON方式
PlistResponseType, // 集合文件方式
ImageResponseType, // 图片方式
CompoundResponseType, // 组合方式 } AFNetworkingResponseType; @protocol NetworkingDelegate <NSObject>
@optional
/**
* 请求成功
*
* @param networking Networking实例对象
* @param data 数据
*/
- (void)requestSucess:(Networking *)networking data:(id)data; /**
* 请求失败
*
* @param networking Networking实例对象
* @param error 错误信息
*/
- (void)requestFailed:(Networking *)networking error:(NSError *)error; /**
* 用户取消请求
*
* @param networking Networking实例对象
* @param error 错误信息
*/
- (void)userCanceledFailed:(Networking *)networking error:(NSError *)error; @end @interface Networking : NSObject /**
* 代理
*/
@property (nonatomic, weak) id <NetworkingDelegate> delegate; /**
* 标识符
*/
@property (nonatomic, strong) NSString *flag; /**
* 超时时间间隔(设置了才能生效,不设置,使用的是AFNetworking自身的超时时间间隔)
*/
@property (nonatomic, strong) NSNumber *timeoutInterval; /**
* 请求的类型
*/
@property (nonatomic) AFNetworkingRequestType requestType; /**
* 回复的类型
*/
@property (nonatomic) AFNetworkingResponseType responseType; /**
* 请求的方法类型
*/
@property (nonatomic) AFNetworkingRequestMethod RequestMethod; /**
* 网络请求地址
*/
@property (nonatomic, strong) NSString *urlString; /**
* 作为请求用字典
*/
@property (nonatomic, strong) NSDictionary *requestDictionary; /**
*
* -====== 此方法由继承的子类来重载实现 ======-
*
* 转换请求字典
*
* @return 转换后的字典
*/
- (NSDictionary *)transformRequestDictionary; /**
*
* -====== 此方法由继承的子类来重载实现 ======-
*
* 对返回的结果进行转换
*
* @return 转换后的结果
*/
- (id)transformRequestData:(id)data; /**
* 开始请求
*/
- (void)startRequest; /**
* 取消请求
*/
- (void)cancelRequest; #pragma mark - 便利构造器方法 /**
* 便利构造器方法
*
* @param urlString 请求地址
* @param requestDictionary 请求参数
* @param delegate 代理
* @param timeoutInterval 超时时间
* @param flag 标签
* @param requestMethod 请求方法
* @param requestType 请求类型
* @param responseType 回复数据类型
*
* @return 实例对象
*/
+ (instancetype)networkingWithUrlString:(NSString *)urlString
requestDictionary:(NSDictionary *)requestDictionary
delegate:(id)delegate
timeoutInterval:(NSNumber *)timeoutInterval
flag:(NSString *)flag
requestMethod:(AFNetworkingRequestMethod)requestMethod
requestType:(AFNetworkingRequestType)requestType
responseType:(AFNetworkingResponseType)responseType; @end
//
// Networking.m
// NetworkingCraft
//
// Created by YouXianMing on 15/6/11.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import "Networking.h"
#import "AFNetworking.h" typedef enum : NSUInteger { DEALLOC_CANCEL, // dealloc取消
USER_CANCEL, // 用户取消 } ECancelType; @interface Networking () #pragma mark - Private Instance
@property (nonatomic, strong) AFHTTPRequestOperationManager *manager;
@property (nonatomic, strong) AFHTTPRequestOperation *httpOperation;
@property (nonatomic) ECancelType cancelType; #pragma mark - Private Method /**
* 默认设置
*/
- (void)defaultConfig; /**
* 根据序列化枚举值返回对应的请求策略
*
* @param serializerType 序列化枚举值
*
* @return 序列化策略
*/
+ (AFHTTPRequestSerializer *)requestSerializerWith:(AFNetworkingRequestType)serializerType; /**
* 根据序列化枚举值返回对应的回复策略
*
* @param serializerType 序列化枚举值
*
* @return 序列化策略
*/
+ (AFHTTPResponseSerializer *)responseSerializerWith:(AFNetworkingResponseType)serializerType; @end @implementation Networking /**
* 初始化方法
*
* @return 实例对象
*/
- (instancetype)init {
self = [super init];
if (self) { // 默认设置
[self defaultConfig];
}
return self;
} - (void)defaultConfig { self.manager = [AFHTTPRequestOperationManager manager]; // 设置回复内容信息
self.manager.responseSerializer.acceptableContentTypes = \
[self.manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; } - (void)startRequest { if (self.urlString.length <= ) {
return;
} // 设置请求类型
if (self.requestType) {
self.manager.requestSerializer = [Networking requestSerializerWith:self.requestType];
} else {
self.manager.requestSerializer = [Networking requestSerializerWith:HTTPRequestType];
} // 设置回复类型
if (self.responseType) {
self.manager.responseSerializer = [Networking responseSerializerWith:self.responseType];
} else {
self.manager.responseSerializer = [Networking responseSerializerWith:HTTPResponseType];
} // 设置超时时间
if (self.timeoutInterval && self.timeoutInterval.floatValue > ) {
[self.manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
self.manager.requestSerializer.timeoutInterval = self.timeoutInterval.floatValue;
[self.manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
} // 开始执行请求
if (self.RequestMethod == GET_METHOD) { __weak Networking *weakSelf = self;
self.httpOperation = [self.manager GET:self.urlString
parameters:[weakSelf transformRequestDictionary]
success:^(AFHTTPRequestOperation *operation, id responseObject) { if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestSucess:data:)]) {
[weakSelf.delegate requestSucess:weakSelf data:[weakSelf transformRequestData:responseObject]];
} }
failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (self.cancelType == USER_CANCEL) {
if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(userCanceledFailed:error:)]) {
[weakSelf.delegate userCanceledFailed:weakSelf error:error];
weakSelf.cancelType = DEALLOC_CANCEL;
}
} else {
if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestFailed:error:)]) {
[weakSelf.delegate requestFailed:weakSelf error:error];
}
} }]; } else if (self.RequestMethod == POST_METHOD) { __weak Networking *weakSelf = self;
self.httpOperation = [self.manager POST:self.urlString
parameters:[weakSelf transformRequestDictionary]
success:^(AFHTTPRequestOperation *operation, id responseObject) { if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestSucess:data:)]) {
[weakSelf.delegate requestSucess:weakSelf data:[weakSelf transformRequestData:responseObject]];
} }
failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (self.cancelType == USER_CANCEL) {
if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(userCanceledFailed:error:)]) {
[weakSelf.delegate userCanceledFailed:weakSelf error:error];
weakSelf.cancelType = DEALLOC_CANCEL;
}
} else {
if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestFailed:error:)]) {
[weakSelf.delegate requestFailed:weakSelf error:error];
}
} }]; } else { }
} - (void)cancelRequest {
self.cancelType = USER_CANCEL;
[self.httpOperation cancel];
} - (void)dealloc {
self.cancelType = DEALLOC_CANCEL;
[self.httpOperation cancel];
} + (AFHTTPRequestSerializer *)requestSerializerWith:(AFNetworkingRequestType)serializerType {
if (serializerType == JSONRequestType) {
return [AFJSONRequestSerializer serializer];
} else if (serializerType == HTTPRequestType) {
return [AFHTTPRequestSerializer serializer];
} else if (serializerType == PlistRequestType) {
return [AFPropertyListRequestSerializer serializer];
} else {
return nil;
}
} + (AFHTTPResponseSerializer *)responseSerializerWith:(AFNetworkingResponseType)serializerType {
if (serializerType == JSONResponseType) {
return [AFJSONResponseSerializer serializer];
} else if (serializerType == HTTPResponseType) {
return [AFHTTPResponseSerializer serializer];
} else if (serializerType == PlistResponseType) {
return [AFPropertyListResponseSerializer serializer];
} else if (serializerType == ImageResponseType) {
return [AFImageResponseSerializer serializer];
} else if (serializerType == CompoundResponseType) {
return [AFCompoundResponseSerializer serializer];
} else {
return nil;
}
} - (NSDictionary *)transformRequestDictionary {
return self.requestDictionary;
} - (id)transformRequestData:(id)data {
return data;
} + (instancetype)networkingWithUrlString:(NSString *)urlString
requestDictionary:(NSDictionary *)requestDictionary
delegate:(id)delegate
timeoutInterval:(NSNumber *)timeoutInterval
flag:(NSString *)flag
requestMethod:(AFNetworkingRequestMethod)requestMethod
requestType:(AFNetworkingRequestType)requestType
responseType:(AFNetworkingResponseType)responseType { Networking *networking = [[[self class] alloc] init];
networking.urlString = urlString;
networking.requestDictionary = requestDictionary;
networking.delegate = delegate;
networking.timeoutInterval = timeoutInterval;
networking.flag = flag;
networking.RequestMethod = requestMethod;
networking.requestType = requestType;
networking.responseType = responseType; return networking;
} @end

下载请求源码

//
// DownloadTask.h
// NetworkingCraft
//
// Created by YouXianMing on 15/6/11.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class DownloadTask; @protocol DownloadTaskDelegate <NSObject>
@optional
/**
* 下载任务
*
* @param downloadTask 实例对象
* @param progress 进度显示
*/
- (void)downloadTask:(DownloadTask *)downloadTask withProgress:(CGFloat)progress; /**
* 下载失败
*
* @param downloadTask 实例对象
* @param error 错误信息
*/
- (void)downloadTask:(DownloadTask *)downloadTask failedWithError:(NSError *)error; /**
* 下载成功
*
* @param downloadTask 实例对象
*/
- (void)downloadTaskSucess:(DownloadTask *)downloadTask; @end @interface DownloadTask : NSObject /**
* 代理
*/
@property (nonatomic, weak) id <DownloadTaskDelegate> delegate; /**
* 下载地址
*/
@property (nonatomic, strong) NSString *urlString; /**
* 存储的文件路径(不包括文件名字,如果不设置,则默认在/Library/Caches文件夹下)
*
* --------------------
* /Documents
* /Library/Caches
* /Library/Preferences
* /tmp
* --------------------
*
*/
@property (nonatomic, strong) NSString *filePath; /**
* 文件名(如果不给文件名,则使用默认的文件名)
*/
@property (nonatomic, strong) NSString *fileName; /**
* 绝对文件路径
*/
@property (nonatomic, strong, readonly) NSString *file; /**
* 开始下载
*/
- (void)startDownload; /**
* 停止下载
*/
- (void)stopDownload; #pragma mark - 便利构造器
/**
* 便利构造器
*
* @param urlString 下载地址
* @param filePath 文件相对目录(可以不设置)
* @param fileName 文件名字(可以不设置)
* @param delegate 代理对象
*
* @return 实例对象
*/
+ (instancetype)downloadTaskWithUrlString:(NSString *)urlString
fileDirectory:(NSString *)filePath
fileName:(NSString *)fileName
delegate:(id)delegate; @end
//
// DownloadTask.m
// NetworkingCraft
//
// Created by YouXianMing on 15/6/11.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
// #import "DownloadTask.h"
#import "AFNetworking.h" @interface DownloadTask () @property (nonatomic, strong) AFHTTPSessionManager *session;
@property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask;
@property (nonatomic, strong) NSString *file; @end @implementation DownloadTask - (instancetype)init {
self = [super init];
if (self) { [self defaultConfig];
} return self;
} - (void)defaultConfig {
self.session = [AFHTTPSessionManager manager];
} - (void)startDownload { if (self.urlString.length <= ) {
return;
} // 定义一个progress指针
NSProgress *progress; // 创建一个URL链接
NSURL *url = [NSURL URLWithString:self.urlString]; // 初始化一个请求
NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 开始下载任务
__weak DownloadTask *weakSelf = self;
self.downloadTask = \
[self.session downloadTaskWithRequest:request
progress:&progress
destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { // 获取基本路径
NSString *filePath = nil; // 文件路径
if (weakSelf.filePath) {
filePath = [weakSelf pathWithSting:self.filePath];
} else {
filePath = [weakSelf pathWithSting:@"/Library/Caches"];
} // 文件名字
if (weakSelf.fileName) {
filePath = [filePath stringByAppendingPathComponent:weakSelf.fileName];
} else {
filePath = [filePath stringByAppendingPathComponent:[response suggestedFilename]];
} // 获取文件绝对路径
weakSelf.file = filePath; NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:filePath]; return documentsDirectoryURL; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { if (weakSelf.delegate) {
// 结束后移除掉这个progress
[progress removeObserver:self
forKeyPath:@"fractionCompleted"
context:nil]; if (error == nil) {
// 成功
if ([weakSelf.delegate respondsToSelector:@selector(downloadTaskSucess:)]) {
[weakSelf.delegate downloadTaskSucess:weakSelf];
}
} else {
// 出错
if ([weakSelf.delegate respondsToSelector:@selector(downloadTask:failedWithError:)]) {
[weakSelf.delegate downloadTask:weakSelf failedWithError:error];
}
} }
}]; // 开始下载
[self.downloadTask resume]; if (self.delegate) {
// 给这个progress添加监听任务
[progress addObserver:self
forKeyPath:@"fractionCompleted"
options:NSKeyValueObservingOptionNew
context:nil];
}
} - (void)stopDownload {
[self.downloadTask cancel];
} /**
* 获取路径
*
* @param string 相对路径
*
* @return 绝对路径
*/
- (NSString *)pathWithSting:(NSString *)string {
return [NSHomeDirectory() stringByAppendingPathComponent:string];
} - (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqualToString:@"fractionCompleted"] && [object isKindOfClass:[NSProgress class]]) {
NSProgress *progress = (NSProgress *)object;
[_delegate downloadTask:self withProgress:progress.fractionCompleted];
}
} + (instancetype)downloadTaskWithUrlString:(NSString *)urlString
fileDirectory:(NSString *)filePath
fileName:(NSString *)fileName
delegate:(id)delegate { DownloadTask *downloadTask = [[[self class] alloc] init];
downloadTask.urlString = urlString;
downloadTask.filePath = filePath;
downloadTask.fileName = fileName;
downloadTask.delegate = delegate; return downloadTask;
} @end

使用

AFNetworking 2.5.x 网络请求的封装的更多相关文章

  1. iOS开发--Swift 基于AFNetworking 3.0的网络请求封装

    Swift和OC基于AFNetworking的网络请求流程相同, 就是语法不同, 对于Swift语法不是很清楚的同学, 建议多看看API文档, 自己多多尝试. 写过OC的应该都明白每句话做什么的, 就 ...

  2. IOS开发之—— 在AFN基础上进行的网络请求的封装

    网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的. 1发送网络请求:get/post/或者别的 带上URL,需要传的参数 2判断后台网络状态码有没有请求成功: 3 请求 ...

  3. 关于ajax网络请求的封装

    // 封装的ajax网络请求函数// obj 是一个对象function AJAX(obj){ //跨域请求        if (obj.dataType == "jsonp") ...

  4. Swift3.0 Alamofire网络请求的封装(get,post,upload图片上传)转

    转自: http://blog.csdn.net/C_calary/article/details/53193747 学习Swift 试着动手写个天气小app,搜集资料这个封装还蛮好用的. 我用的第三 ...

  5. Angular网络请求的封装

    很多时候,我很喜欢angular的编码风格,特别是angular支持typescript之后,完整的生命周期,完美的钩子函数,都是别的语言所无法替代的.这里我来说说我自己的网络请求封装,某种意义上来说 ...

  6. Axios 网络请求组件封装 (鉴权、刷新、拦截)

    一.前言 注意:本教程需要你对axios有一定的了解,不适用于小白(只能借鉴,希望你能自己动手),注释都写的很清楚.此封装并非完整版,已进行部分删减修改操作,但仍然适用于大部分业务场景,如果不适用于你 ...

  7. iOS-在AFN基础上进行网络请求的封装

    网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的. 1发送网络请求:get/post/或者别的 带上URL,需要传的参数 2判断后台网络状态码有没有请求成功: 3 请求 ...

  8. 对小程序的网络请求的封装 wx.request 接收参数修改

    wepy-mall/wxRequest.js at master · dyq086/wepy-mall https://github.com/dyq086/wepy-mall/blob/master/ ...

  9. iOS - AFNetworking 网络请求

    前言 在 iOS 开发中,一般情况下,简单的向某个 Web 站点简单的页面提交请求并获取服务器的响应,用 Xcode 自带的 NSURLConnection 是能胜任的.但是,在绝大部分下我们所需要访 ...

随机推荐

  1. android学习-仿Wifi模块实现

    最近研究android内核-系统关键服务的启动解析,然而我也不知道研究wifi的作用,就当兴趣去做吧(其实是作业-_-) 系统原生WiFI功能大概有:启动WiFI服务,扫描WiFi信息(这个好像已经被 ...

  2. Linux中终端和控制台的一些不成熟的理解

    首先声明,这仅仅是在下一些不成熟的想法.是通过看网上的一些资料和自己实践的一些心得,应该都是些很不成熟甚至是不太正确的想法.但是我还是想记录下来,算是一个心路历程吧.等以后成熟了,再来修改. 首先说一 ...

  3. Nodejs学习笔记(五)—Express安装入门与模版引擎ejs

    前言 前面也学习了一些Node.js的基本入门知道,现在开始进入Web开发的部分: Node.js提供了http模块,这个模块中提供了一些底层接口,可以直接使用,但是直接开发网站那还是太累了,所以ht ...

  4. MVC及MVC Core在filter中如何获取控制器名称和Action名称

    很多时候我们需要使用过滤器来实现一些拦截.验证等行为,此时我们能获取到的Context是ActionExecutingContext ,我们如何通过这个Context来获得Action.Control ...

  5. Java Date SimpleDateFormat

    public static void main(String[] args) { long millis = 1492741275301L; Calendar calendar = Calendar. ...

  6. 图片切换(timer控件与ImagesList结合使用)

    private void Form3_Load(object sender, EventArgs e) { //打开窗体的时候显示第一张图片 this.pictureBox1.Image = this ...

  7. Xcode DEBUG宏定义,debug和release模式的选择

    设置DEBUG, 使用宏定义: #if DEBUG NSLog(@"debug model"); #else //执行release模式的代码 #endif

  8. JSTL fn:split()函数

    jstl fn:split()函数代码和用法 -使用fn:split() 函数将一个字符串到一个数组根据分隔符字符串的子字符串. 使用fn:split() 函数将一个字符串到一个数组根据分隔符字符串的 ...

  9. 【原】Shiro框架基础搭建[2]

    简介: 关于搭建一个最基础的shiro网上的例子有很多,这里是记录一下自己尝试去看官方文档所搭建的一个小demo,项目采用的是原始的java静态工程,导入相关jar包后就能运行. 首先进入官网http ...

  10. UNIX高手应该保持的习惯

    UNIX 高手的 10 个习惯 克服不良的 UNIX 使用模式 采用 10 个能够提高您的 UNIX® 命令行效率的好习惯——并在此过程中摆脱不良的使用模式.本文循序渐进地指导您学习几项用于命令行操作 ...