AFNetworking是iOS开发中的一个网络请求库,通过AFNetworking,可以很方便的实现网络请求,下面记录这个库的使用方法:
1、新建工程,名为TestAFNetworking,并使用cocoapods导入AFNetworking库,如果不清楚使用cocoapods导入第三方库的方法,可以看这篇博文。
Podfile文件的内容如下:
platform:ios, ‘7.0’ pod ‘AFNetworking’, ‘~> 2.5’2、进入TestAFNetworking项目,双击TestAFNetworking.xcworkspace打开工程,然后在Main.storyboard中加入一个UITextView控件,并在ViewController.h文件中声明该控件,代码如下:
#import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UITextView *textView; @end3、将声明的textView变量与Main.storyboard中的UITextView控件建立联系,然后在ViewController.m文件中引入AFNetworking的头文件:
#import "AFNetworking.h"4、编写代码从http://www.baidu.com获取数据并显示到UITextView控件上。
下面是ViewController.m文件的代码:
#import "ViewController.h" #import "AFNetworking.h" @interface ViewController () @end @implementation ViewController static NSString *urlStr = @"http://www.baidu.com"; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self requestBaidu]; } #pragma mark 请求百度并显示返回的数据 - (void)requestBaidu { NSURL *url = [NSURL URLWithString:urlStr]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { //请求成功后,在textView上显示返回的数据 self.textView.text = operation.responseString; } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) { //请求失败,显示错误详情 self.textView.text = [NSString stringWithFormat:@"%@", error]; }]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:operation]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end上面就是使用AFNetworking进行网络请求的步骤,如果直接运行上面的代码,可能会报错如下:
这是因为xcode默认不允许http请求,需要在info.plist文件中配置如下:
配置成功后即可正常使用http请求了,再次运行上面的代码,结果如下图所示:
可以看到模拟器中已显示出从百度首页获取的数据了。
5、使用AFNetworking发送get请求,如下面的代码所示:
#pragma mark get请求 - (void)getRequest { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //get请求传递的参数 NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"name"] = @"zhangsan"; params[@"age"] = [NSString stringWithFormat:@"%i", 20]; //发送get请求 [manager GET:urlStr parameters:params success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { //请求成功 self.textView.text = operation.responseString; } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) { //请求失败 self.textView.text = [NSString stringWithFormat:@"%@", error]; }]; }
这里需要注意的一点是,AFNetworking默认将请求返回的结果当做json来处理,如果我们请求百度首页,返回的是html而并非json,如果执行上面的代码,会报错,需要在获取manager的代码后面加上一行代码:
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
6、使用AFNetworking获取并显示图片:
#pragma mark 显示图片 - (void)showImage { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //指定返回数据的MIME类型,这里返回的是图片 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"image/jpeg", nil]; [manager GET:@"http://pic.3gbizhi.com/2016/0308/20160308010228743.jpg.227.318.jpg" parameters:nil success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { self.imageView.image = [UIImage imageWithData:operation.responseData]; } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) { NSLog(@"%@", error); }]; }代码执行的结果如下图所示: