iOS第三方网络请求框架--AFNetworking

AFURLConnectionOperation

可以说是AFN最基础的类。继承自NSOperation类,将网络请求依附到一个operation上。从而让我们能够有效的控制并观察一个网络请求的创建、进行、取消、完成、暂停恢复、异常等问题及状态。

AFHTTPRequestOperation

HTTP或HTTPS协议请求的AFURLConnectionOperation的子类。它封装的可接受状态码和内容的类型,判定一个请求结果是成功或失败

AFHTTPRequestOperationManager

这个类是AFN类库的核心类。它封装完成了一种通用的模式,可以帮助我们轻松友好的完成请求的创建、响应的系列化,网络状态的监控以及安全策略以及每一个请求operation的管理(operation的相互依赖或状态改变)

AFURLRequestSerialization

符合这个协议的对象用于处理请求,它将请求参数转换为 query string 或是 entity body 的形式,并设置必要的 header

AFURLResponseSerialization

遵循AFURLResponseSerialization协议的对象,用于验证、序列化响应及相关数据,转换为有用的形式,比如 JSON 对象、图像、甚至基于mantle的模型对象

AFNetworkReachabilityManager

网络的连通状态监控以及网络的类型。实际是将苹果官方提供的Reachability的类名和通知名更换了一下


AFHTTPRequestOperationManager

实例化单例

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];


GET\POST\PUT\PATCH请求

//GET请求

- (AFHTTPRequestOperation *)GET:(NSString *)URLString

parameters:(id)parameters

success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success

failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

//POST请求

- (AFHTTPRequestOperation *)POST:(NSString *)URLString

parameters:(id)parameters

success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success

failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

//PUT请求

- (AFHTTPRequestOperation *)PUT:(NSString *)URLString

parameters:(id)parameters

success:( void (^)(AFHTTPRequestOperation *operation, id responseObject))success

failure:( void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

//PATCH请求

- (AFHTTPRequestOperation *)PATCH:(NSString *)URLString

parameters:(id)parameters

success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success

failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;


文件上传

- (AFHTTPRequestOperation *)POST:(NSString *)URLString

parameters:(id)parameters

constructingBodyWithBlock:(void (^)(id formData))block

success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success

failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure


监控联网状态

AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];

[manager startMonitoring];

[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

NSLog(@"%d", status);

}];

提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法

1.AFHTTPRequestOperationManager

* 对NSURLConnection的封装

2.AFHTTPSessionManager

* 对NSURLSession的封装


对服务器返回数据的解析

1.AFN可以自动对服务器返回的数据进行解析

* 默认将服务器返回的数据当做JSON来解析

2.设置对服务器返回数据的解析方式

1> 当做是JSON来解析(默认做法)

* mgr.responseSerializer = [AFJSONResponseSerializer serializer];

* responseObject的类型是NSDictionary或者NSArray

2> 当做是XML来解析

* mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];

* responseObject的类型是NSXMLParser

3> 直接返回data

* 意思是:告诉AFN不要去解析服务器返回的数据,保持原来的data即可

* mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

3.注意

* 服务器返回的数据一定要跟responseSerializer对得上

1> 服务器返回的是JSON数据

* AFJSONResponseSerializer

* AFHTTPResponseSerializer

2> 服务器返回的是XML数据

* AFXMLParserResponseSerializer

* AFHTTPResponseSerializer

3> 服务器返回的是其他数据

* AFHTTPResponseSerializer


AFNetworking网络请求实例

#import "AFNetworking.h"

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

[self postJSON];

}

- (void)getSession

{

// AFHTTPSessionManager 对 NSURLSession 的封装

AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

[mgr GET:@"" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {

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

}];

}

/**

*  利用AFN发送一个POST请求,服务器返回的JSON数据

*/

- (void)postJSON

{

// AFHTTPRequestOperationManager 对 NSURLConnection的封装

// 1.创建一个请求操作管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

// 2.请求参数

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"username"] = @"哈哈哈";

params[@"pwd"] = @"123";

// 3.发送一个GET请求

NSString *url = @"http://localhost:8080/MJServer/login";

[mgr POST:url parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObject) {

// 请求成功的时候调用这个block

NSLog(@"请求成功---%@", responseObject);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// 请求失败的时候调用调用这个block

NSLog(@"请求失败");

}];

}

/**

*  利用AFN发送一个GET请求,服务器返回的JSON数据,让AFN直接返回data

*/

- (void)getData

{

// 1.创建一个请求操作管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

// 声明:不要对服务器返回的数据进行解析,直接返回data即可

// 如果是文件下载,肯定是用这个

// responseObject的类型是NSData

mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

// 2.请求参数

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"username"] = @"哈哈哈";

params[@"pwd"] = @"123";

// 3.发送一个GET请求

NSString *url = @"http://localhost:8080/MJServer/login";

[mgr GET:url parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObject) {

// 请求成功的时候调用这个block

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];

NSLog(@"%@", dict);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// 请求失败的时候调用调用这个block

NSLog(@"请求失败");

}];

}

/**

*  利用AFN发送一个GET请求,服务器返回的XML数据

*/

- (void)getXML

{

// 1.创建一个请求操作管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

// 声明:等会服务器返回的是XML数据

// responseObject的类型是NSXMLParser

mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];

// 2.请求参数

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"username"] = @"哈哈哈";

params[@"pwd"] = @"123";

params[@"type"] = @"XML";

// 3.发送一个GET请求

NSString *url = @"http://localhost:8080/MJServer/login";

[mgr GET:url parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObject) {

// 请求成功的时候调用这个block

NSLog(@"请求成功--%@", responseObject);

//        responseObject.delegate = self;

//        [responseObject parse];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// 请求失败的时候调用调用这个block

NSLog(@"请求失败");

}];

}

/**

*  利用AFN发送一个GET请求,服务器返回的JSON数据

*/

- (void)getJSON

{

// 1.创建一个请求操作管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

// 声明一下:服务器返回的是JSON数据

//    mgr.responseSerializer = [AFJSONResponseSerializer serializer];

// responseObject的类型是NSDictionary或者NSArray

// 2.请求参数

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"username"] = @"哈哈哈";

params[@"pwd"] = @"123";

// 3.发送一个GET请求

NSString *url = @"http://localhost:8080/Server/login";

[mgr GET:url parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObject) {

// 请求成功的时候调用这个block

NSLog(@"请求成功---%@", responseObject);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

// 请求失败的时候调用调用这个block

NSLog(@"请求失败");

}];

}

@end


AFNetworking文件上传实例

#import "AFNetworking.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

- (IBAction)upload;

@end

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"请选择图片" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照", @"相册", nil];

[sheet showInView:self.view.window];

}

#pragma mark - UIActionSheet

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

{

UIImagePickerController *ipc = [[UIImagePickerController alloc] init];

// 设置代理

ipc.delegate = self;

switch (buttonIndex) {

case 0: { // 拍照

if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) return;

ipc.sourceType = UIImagePickerControllerSourceTypeCamera;

break;

}

case 1: { // 相册

if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) return;

ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

break;

}

default:

break;

}

// 显示控制器

[self presentViewController:ipc animated:YES completion:nil];

}

#pragma mark - UIImagePickerControllerDelegate

/**

*  在选择完图片后调用

*

*  @param info  里面包含了图片信息

*/

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

{

// 销毁控制器

[picker dismissViewControllerAnimated:YES completion:nil];

// 获得图片

UIImage *image = info[UIImagePickerControllerOriginalImage];

// 显示图片

self.imageView.image = image;

}

- (void)upload1

{

// 1.创建一个管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

// 2.封装参数(这个字典只能放非文件参数)

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"username"] = @"123";

params[@"age"] = @20;

params[@"pwd"] = @"456";

params[@"height"] = @1.55;

// 2.发送一个请求

NSString *url = @"http://localhost:8080/MJServer/upload";

[mgr POST:url parameters:params constructingBodyWithBlock:^(id formData) {

// 在发送请求之前会自动调用这个block

// 需要在这个block中添加文件参数到formData中

/**

FileURL : 需要上传的文件的URL路径

name : 服务器那边接收文件用的参数名

fileName : (告诉服务器)所上传文件的文件名

mimeType : 所上传文件的文件类型

*/

NSURL *url = [[NSBundle mainBundle] URLForResource:@"itcast" withExtension:@"txt"];

[formData appendPartWithFileURL:url name:@"file" fileName:@"test.txt" mimeType:@"text/plain" error:nil];

/**

FileData : 需要上传的文件的具体数据

name : 服务器那边接收文件用的参数名

fileName : (告诉服务器)所上传文件的文件名

mimeType : 所上传文件的文件类型

*/

//        UIImage *image = [UIImage imageNamed:@"minion_01"];

//        NSData *fileData = UIImagePNGRepresentation(image);

//        [formData appendPartWithFileData:fileData name:@"file" fileName:@"haha.png" mimeType:@"image/png"];

} success:^(AFHTTPRequestOperation *operation, id responseObject) {

NSLog(@"上传成功");

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

NSLog(@"上传失败");

}];

}

- (IBAction)upload {

if (self.imageView.image == nil) return;

// 1.创建一个管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

// 2.封装参数(这个字典只能放非文件参数)

NSMutableDictionary *params = [NSMutableDictionary dictionary];

params[@"username"] = @"123";

params[@"age"] = @20;

params[@"pwd"] = @"456";

params[@"height"] = @1.55;

// 2.发送一个请求

NSString *url = @"http://192.168.15.172:8080/Server/upload";

[mgr POST:url parameters:params constructingBodyWithBlock:^(id formData) {

NSData *fileData = UIImageJPEGRepresentation(self.imageView.image, 1.0);

[formData appendPartWithFileData:fileData name:@"file" fileName:@"haha.jpg" mimeType:@"image/jpeg"];

// 不是用这个方法来设置文件参数

//        [formData appendPartWithFormData:fileData name:@"file"];

} success:^(AFHTTPRequestOperation *operation, id responseObject) {

NSLog(@"上传成功");

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

NSLog(@"上传失败");

}];

// 文件下载,文件比较大,断点续传技术:普遍所有的HTTP服务器都支持

// 文件上传,文件比较大,断点续传技术:一般的HTTP服务器都不支持,常用的技术用的是Socket(TCP\IP、UDP)

}

@end


上图为2017年最新的视频教程资料,搜索235再填上214最后输入9755加我好友私聊我上传视频教程,有什么不懂的也可以来私聊问我。

不定时更新中。

如果你能明白这些视频资料的好差,那么你也算是入行了,底层和中高层就是这一步之差。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容