AFNetwork作用和用法详解

AFNetworking是iOS中最常用的网络通信框架之一。它被广泛用于iOS应用程序的网络通信模块,提供了比NSURLConnection更强大的功能和更简便的API。在这篇文章中,我们将深入介绍AFNetworking的作用、使用方法以及在实际开发中的案例说明。

一.AFNetworking的作用

AFNetworking具有以下主要功能:

1.提供了比NSURLConnection更强大的功能。

AFNetworking通过提供高层次的API,使得开发人员可以更轻松地完成网络通信。你不需要手动创建NSURLConnection对象并实现其委托方法,响应和错误处理。AFNetworking已经为你处理了请求和响应串行化,以及错误处理。

2.SSL Pinning(SSL证书校验)

SSL Pinning(SSL证书校验)是一种安全机制,在使用HTTPS时防止中间人攻击。AFNetworking提供了SSL Pinning的支持,允许你验证服务器的证书。

3.支持RESTful API

RESTful API是基于HTTP协议的设计规范。AFNetworking能够轻松地支持RESTful API的设计,提供了快速、方便的API来处理HTTP方法,如GET、POST、PUT、DELETE等。

4.易于扩展

AFNetworking允许你编写自己的HTTP请求操作,以便于扩展AFNetworking的功能,包括使用自定义URL协议或其他协议来处理请求。同时,AFNetworking充分利用了Objective-C运行时的特性,允许动态替换和注入方法和属性。

二.AFNetworking的使用方法

AFNetworking的使用非常简单,我们只需要三个步骤即可完成网络请求:

1.导入AFNetworking

在项目中导入AFNetworking,你可以使用CocoaPods来管理你的依赖关系,你只需要将以下代码添加到你的Podfile即可:

pod 'AFNetworking'

2.创建请求

AFNetworking提供了多种方法用于处理HTTP请求,包括GET、POST、PUT、DELETE等。创建请求的方法取决于你需要使用的HTTP方法。以下是一个简单的GET请求示例:

```objc

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:@"http://example.com/resources.json"

parameters:nil

progress:nil

success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

NSLog(@"JSON: %@", responseObject);

}

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

NSLog(@"Error: %@", error);

}];

```

这里的manager对象是AFHTTPSessionManager的实例,是用于管理请求的控制器对象。GET请求由GET方法和URL构成。parameters参数是一个字典,用于设置请求的参数。成功和失败的block用于处理请求的响应和错误。

3.处理响应

你可以使用success block来处理请求的响应,通过调用success block并传递响应对象,使AFNetworking重新配置响应对象。以下是一个简单的JSON解析示例:

```objc

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:@"http://example.com/resources.json"

parameters:nil

progress:nil

success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

if ([responseObject isKindOfClass:[NSDictionary class]]) {

NSDictionary *response = (NSDictionary *)responseObject;

// Do something with response

}

}

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

NSLog(@"Error: %@", error);

}];

```

这里的responseObject参数表示通过AFNetworking自动解析的响应对象。

三.AFNetworking的案例说明

1.发起GET请求

以下是一个发起GET请求的示例,我们从服务器请求城市列表,并将结果放在一个tableView中显示。

```objc

@interface ViewController ()

@property (nonatomic,strong) NSMutableArray *tableData;

@property (nonatomic,strong) UITableView *tableView;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

[self createUI];

[self requestData];

}

#pragma mark - UI

- (void)createUI{

self.tableView = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];

self.tableView.delegate = self;

self.tableView.dataSource = self;

[self.view addSubview:self.tableView];

}

#pragma mark - NetWork

- (void)requestData{

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://raw.githubusercontent.com/yakun2016/file/master/city.json"]];

[request setHTTPMethod:@"GET"];

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

if (error == nil) {

NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

[self.tableData addObjectsFromArray:array];

dispatch_async(dispatch_get_main_queue(), ^{

[self.tableView reloadData];

});

}

}];

[task resume];

}

#pragma mark - getter

- (NSMutableArray *)tableData {

if (!_tableData) {

_tableData = [NSMutableArray new];

}

return _tableData;

}

#pragma mark - UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

return self.tableData.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

static NSString *identifier = @"cell";

UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:identifier];

if (!cell) {

cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

}

NSDictionary *dict = [self.tableData objectAtIndex:indexPath.row];

cell.textLabel.text = [dict objectForKey:@"name"];

return cell;

}

@end

```

这里我们使用NSURLSession发起GET请求,将请求到的数据放在了一个数组中并用tableView显示。

2.发起POST请求

以下是一个发起POST请求的示例,我们从服务器请求签到功能,包括签到的日期和城市信息。

```objc

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

[self requestLogin];

}

- (void)requestLogin{

NSString *urlStr = @"https://example.com/signin";

NSString *dataStr = [NSString stringWithFormat:@"name=%@&password=%@", @"user_name", @"password"];

NSURL *url = [NSURL URLWithString:urlStr];

NSMutableURLRequest *postRequest = [[NSMutableURLRequest alloc]initWithURL:url];

[postRequest setHTTPMethod:@"POST"];

[postRequest setHTTPBody:[dataStr dataUsingEncoding:NSUTF8StringEncoding]];

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];

sessionConfig.timeoutIntervalForRequest = 15;

NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]];

NSURLSessionDataTask *task = [session dataTaskWithRequest:postRequest

completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

if (error == nil) {

NSLog(@"response:%@",response);

}

else {

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

}

}];

[task resume];

}

@end

```

这里我们使用NSURLSession发起POST请求,将请求数据放在请求体中,并通过NSURLSessionDataTask对象获取请求的结果。

3.使用AFNetworking发起GET请求

以下是一个发起GET请求的示例,我们使用AFNetworking从服务器请求城市列表,并将结果放在一个tableView中显示。

```objc

@interface ViewController ()

@property (nonatomic,strong) NSMutableArray *tableData;

@property (nonatomic,strong) UITableView *tableView;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

[self createUI];

[self requestData];

}

#pragma mark - UI

- (void)createUI{

self.tableView = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];

self.tableView.delegate = self;

self.tableView.dataSource = self;

[self.view addSubview:self.tableView];

}

#pragma mark - NetWork

- (void)requestData{

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:@"https://raw.githubusercontent.com/yakun2016/file/master/city.json"

parameters:nil

headers:nil

progress:nil

success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

if ([responseObject isKindOfClass:[NSArray class]]) {

NSArray *array = (NSArray *)responseObject;

[self.tableData addObjectsFromArray:array];

dispatch_async(dispatch_get_main_queue(), ^{

[self.tableView reloadData];

});

}

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

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

}];

}

#pragma mark - getter

- (NSMutableArray *)tableData {

if (!_tableData) {

_tableData = [NSMutableArray new];

}

return _tableData;

}

#pragma mark - UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

return self.tableData.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

static NSString *identifier = @"cell";

UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:identifier];

if (!cell) {

cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

}

NSDictionary *dict = [self.tableData objectAtIndex:indexPath.row];

cell.textLabel.text = [dict objectForKey:@"name"];

return cell;

}

@end

```

这里我们使用了AFNetworking发起GET请求,并将请求到的数据通过tableView显示出来。

四.总结

通过此次的介绍,我们了解了AFNetworking的作用、使用方法,以及在实际开发中的应用。AFNetworking是一个易于使用的网络通信框架,提供了强大的功能和简便的API,以便于更快速、更简便地完成网络通信。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(106) 打赏

评论列表 共有 1 条评论

善恶都是我 11月前 回复TA

我从没见过长的这么有考古价值的。

立即
投稿
发表
评论
返回
顶部