AFNetworking2.0概述

最近一直在研究iOS网络开发,对NSURLSession套件进行了深入研究,作为iOS开发者,熟悉苹果的原生技术,可以在不需要第三方框架的情况下进行网络开发,也更有利于从底层了解iOS网络请求的原理,不过为了便捷开发,我们可能使用点第三方的框架的机会会更多,这就不得不提AFNetworking了,我将通过本文总结AFNetworking2.0的使用。

AFNetworking的版本和要求

我们先来了解AFNetworking的各个版本:

AFNetworking的结构

我们再通过一张表来清晰地介绍AFNetworking 2.0包含的类,以及它的结构。


AFNetworking 2.0类结构


NSURLConnection


AFURLConnectionOperation


NSOperation子类,实现NSURLConnection代理方法


AFHTTPRequestOperation


AFURLConnectionOperation子类,用于http和https请求,封装了状态码和content type


AFHTTPRequestOperationManager


封装了常见的http网络通信,包括request请求的建立、response响应的数据格式序列化、网络状态监控、安全以及请求的管理等工作。


NSURLSession


AFURLSessionManager


对NSURLSession网络请求技术的封装。它基于NSURLSessionConfiguration对象来创建和管理NSURLSession对象,并且遵守了NSURLSessionTaskDelegate、NSURLSessionDataDelegate、NSURLSessionDownloadDelegate、NSURLSessionDelegate。


AFHTTPSessionManager


AFURLSessionManager的子类,主要提供了了http请求的有关方法


Serialization

序列化


AFHTTPRequestSerializer


AFJSONRequestSerializer


AFPropertyListRequestSerializer


AFHTTPResponseSerializer


AFJSONResponseSerializer


AFXMLParserResponseSerializer


AFXMLDocumentResponseSerializer


AFPropertyListResponseSerializer


AFImageResponseSerializer


AFCompoundResponseSerializer


监控网络


AFNetworkReachabilityManager


AFNetworkReachabilityManager监测域名以及IP地址的畅通性,对于WWAN以及WiFi的网络接口都管用。


附加功能


AFSecurityPolicy


AFNetworkReachabilityManager

AFNetworking各大类介绍

一、AFHTTPRequestOperationManager

AFHTTPRequestOperationManager封装了常见的http网络通信,包括request请求的建立、response响应的数据格式序列化、网络状态监控、安全以及请求的管理等工作。

1.get请求

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

2.post请求

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

3.更复杂的post请求

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileURL:filePath name:@"image" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

二、AFURLSessionManager

AFURLSessionManager主要是对NSURLSession网络请求技术的封装。它基于NSURLSessionConfiguration对象来创建和管理NSURLSession对象,并且遵守了NSURLSessionTaskDelegate、NSURLSessionDataDelegate、NSURLSessionDownloadDelegate、NSURLSessionDelegate。

1.创建下载任务

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
    return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume];

2.创建上传任务

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"Success: %@ %@", response, responseObject);
    }
}];
[uploadTask resume];

3.创建包含进度显示的复杂的上传任务

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil];
    } error:nil];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSProgress *progress = nil;

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"%@ %@", response, responseObject);
    }
}];

[uploadTask resume];

4.创建数据任务

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"%@ %@", response, responseObject);
    }
}];
[dataTask resume];

三、AFNetworkReachabilityManager

AFNetworkReachabilityManager监测域名以及IP地址的畅通性,对于WWAN以及WiFi的网络接口都管用。

1.单例形式检测网络畅通性

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];

2.用基本的URL管理HTTP

NSURL *baseURL = [NSURL URLWithString:@"http://example.com/"];
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];

NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  switch (status) {
    case AFNetworkReachabilityStatusReachableViaWWAN:
    case AFNetworkReachabilityStatusReachableViaWiFi:
      [operationQueue setSuspended:NO];
      break;
    case AFNetworkReachabilityStatusNotReachable:
    default:
      [operationQueue setSuspended:YES];
      break;
  }
}];

四、AFHTTPRequestOperation

  AFHTTPRequestOperation 继承自 AFURLConnectionOperation,使用HTTP以及HTTPS协议来处理网络请求。它封装成了一个可以令人接受的代码形式。当然AFHTTPRequestOperationManager 目前是最好的用来处理网络请求的方式,但AFHTTPRequestOperation 也有它自己的用武之地。

1.AFHTTPRequestOperation发送get请求

NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
[[NSOperationQueue mainQueue] addOperation:op];

2.多操作一起进行

NSMutableArray *mutableOperations = [NSMutableArray array];
for (NSURL *fileURL in filesToUpload) {
    NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileURL:fileURL name:@"images[]" error:nil];
    }];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    [mutableOperations addObject:operation];
}

NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:@[...] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
    NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations);
} completionBlock:^(NSArray *operations) {
    NSLog(@"All operations in batch complete");
}];
[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO];
时间: 2024-12-30 00:02:38

AFNetworking2.0概述的相关文章

AFNetworking2.0参数默认编码格式是UTF8,如何指定参数编码格式为gb2312

问: AFNetworking2.0 encodes parameters with UTF8. How can I change AFNetworking 2.0's parameter encoding to gb2312? NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding (kCFStringEncodingGB_18030_2000); That encoding is gb2312, but how to

iOS 8:AFNetworking2.0源码解析 1

源地址:http://blog.cnbang.net/tech/2320/ 最近看AFNetworking2的源码,学习这个知名网络框架的实现,顺便梳理写下文章.AFNetworking2的大体架构和思路在这篇文章已经说得挺清楚了,就不再赘述了,只说说实现的细节.AFNetworking的代码还在不断更新中,我看的是AFNetworking2.3.1. 本篇先看看AFURLConnectionOperation,AFURLConnectionOperation继承自NSOperation,是一个

AFNetworking2.0 访问HTTPS服务器

在AFNetworking2.0下想要访问HTTPS服务器,需要做如下设置: AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; [securityPolicy setAllowInvalidCertificates:YES]; NSURL *URL = [NSURL URLWithString:url]; NSMutableURLRequest *re

AFNetworking2.0 输出服务器返回的原始数据

在使用AFNetworking2.0的过程中,有时会出现类似The Operation couldn't be completed. (Cocoa error: 3840.)的错误,经过多次排查,发现都是服务器返回的数据存在或多或少的问题,又或者是服务器报错404等等问题,这个时候就需要看看服务器返回的原数据到底是什么,以下的方法就是如何输出元数据 在AFNetworking2.0的目录下找到文件AFURLResponseSerialization.m,在246行处添加 NSLog(@"requ

AFNetworking2.0源码解析&lt;一&gt;

(via:bang's blog) 最近看AFNetworking2的源码,学习这个知名网络框架的实现,顺便梳理写下文章.AFNetworking的代码还在不断更新中,我看的是AFNetworking2.3.1. 本篇先看看AFURLConnectionOperation,AFURLConnectionOperation继承自NSOperation,是一个封装好的任务单元,在这里构建了NSURLConnection,作为NSURLConnection的delegate处理请求回调,做好状态切换,

AFNetworking2.0源码解析

写在前面给大家推荐一个不错的网站 点击打开链接 本文测试例子源码下载地址 最近看AFNetworking2的源码,学习这个知名网络框架的实现,顺便梳理写下文章.AFNetworking的代码还在不断更新中,我看的是AFNetworking2.3.1. 本篇先看看AFURLConnectionOperation,AFURLConnectionOperation继承自NSOperation,是一个封装好的任务单元,在这里构建了NSURLConnection,作为NSURLConnection的del

httprunner2.0 概述及使用说明

一 概述 HttpRunner是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试.性能测试.线上监控.持续集成等多种测试需求. 二 系统流程 三 文件组织 1.项目文件目录结构 说明:(1)api 文件夹:存储接口定义描述(2)testcases 文件夹:存储测试用例,文件夹也可以使用其它名称(3)testsuites 文件夹:测试测试场景,文件夹也可以使用其它名称(4)reports 文件夹:存储 HTML 测试报告(5).env文件

AFNetworking2.0源码解析&lt;三&gt;

本篇说说安全相关的AFSecurityPolicy模块,AFSecurityPolicy用于验证HTTPS请求的证书,先来看看HTTPS的原理和证书相关的几个问题. HTTPS HTTPS连接建立过程大致是,客户端和服务端建立一个连接,服务端返回一个证书,客户端里存有各个受信任的证书机构根证书,用这些根证书对服务端 返回的证书进行验证,经验证如果证书是可信任的,就生成一个pre-master  secret,用这个证书的公钥加密后发送给服务端,服务端用私钥解密后得到pre-master secr

IOS AFNetworking2.0 问题

1.Error Domain=AFNetworkingErrorDomain Code=-1011 "Request failed: not found (404)" UserInfo=0x86811c0 {NSErrorFailingURLKey=http://192.168.6.77:8080/demo/rest/demo/getApplicationList, NSLocalizedDescription=Request failed: not found (404), NSUn