導(dǎo)語(yǔ):
眾所周知,AFNetworking是目前IOS開發(fā)中非常受歡迎的第三方網(wǎng)絡(luò)通信類庫(kù),同時(shí)AFNetworking對(duì)蘋果官方NSURLConnection和NSURLSession進(jìn)行了封裝,使用起來可以說是簡(jiǎn)單的"令人發(fā)指".
官網(wǎng)地址:
AFNetworking有關(guān)請(qǐng)求與響應(yīng)的信息
請(qǐng)求:(序列化)
AFURLRequestSerialization
AFHTTPRequestSerializer(默認(rèn)) 傳輸?shù)木褪嵌M(jìn)制
AFJSONRequestSerializer 傳輸入的二進(jìn)制是一個(gè)JSON格式的二進(jìn)制 ,只有NSArray,NSDictionay
AFPropertyListRequestSerializer 傳輸?shù)牡綍r(shí)候是一個(gè)plist,這個(gè)不玩意兒不用,因?yàn)樗煌ㄓ?
響應(yīng):(反序列化)
<AFURLResponseSerialization>
AFHTTPResponseSerializer //返回的就一個(gè)純潔的二進(jìn)制
AFJSONResponseSerializer(默認(rèn)) 返回的是一個(gè)JSON格式的二進(jìn)制,并且AFN幫我們自動(dòng)序列化成了字典或是數(shù)組
AFXMLParserResponseSerializer XMLParser
AFXMLDocumentResponseSerializer (Mac OS X) 不適合我們的iOS
AFPropertyListResponseSerializer plist
AFImageResponseSerializer //國(guó)片
AFCompoundResponseSerializer //混合
使用AFNetworking
- GET方法:
//1.首先創(chuàng)建一個(gè)管理者
AFHTTPRequestOperationManager *manager =[AFHTTPRequestOperationManager manager];
//2.發(fā)送請(qǐng)求
//在使用AFN的時(shí)候,直接傳遞我們url的字符串就可以了
//AFN在反序列化的時(shí)候,默認(rèn)是幫我們按照J(rèn)SON的格式去解析
[manager GET:@"http://localhost/test.json" parameters:nil success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
//第一個(gè)參數(shù) operation 操作
//第二個(gè)參數(shù) responseObject
NSLog(@"%@---%@",responseObject,[responseObject class]);
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
- POST方法:
//1.創(chuàng)建一個(gè)基于NSURLConnection的管理
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//2.發(fā)送我們的POST請(qǐng)求
//用戶名密碼
NSDictionary *param = @{@"username":@"admin",@"password":@"123"};
//登陸到得網(wǎng)址
[manager POST:@"http://localhost/login.php" parameters:param success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
NSLog(@"post result====%@---%@",responseObject,[responseObject class]);
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
- AFNetworking之搭配webView使用
注意:因?yàn)槟J(rèn)情況下AFNetworking的響應(yīng)解析方式都是按照J(rèn)OSN解析,所以我們需要修改AFNetworking的解析方式,但是為了以后使用方便,我們不在AFNetworking基礎(chǔ)上修改,我們添加一個(gè)類繼承自AFHTTPSessionManager然后創(chuàng)建一個(gè)單例,這樣以后AFNetworking更新,我們的代碼也不會(huì)因此受到影響.
首先創(chuàng)建NetWorkTool類,并創(chuàng)建單例方法
#import "AFHTTPSessionManager.h"
@interface NetWorkTool : AFHTTPSessionManager
//單例
+ (instancetype)sharedNetWorkTool;
@end
實(shí)現(xiàn)單例方法
#import "NetWorkTool.h"
@implementation NetWorkTool
static NetWorkTool *_instance;
+ (instancetype)sharedNetWorkTool{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[NetWorkTool alloc] initWithBaseURL:nil];
_instance.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil];
//默認(rèn)情況下的響應(yīng)解析方式,就是不管服務(wù)器給我們返回的是什么,都按照J(rèn)SON去解析
//將默認(rèn)的JSON序列化方式,改成我們最普通的二進(jìn)制
_instance.responseSerializer = [AFHTTPResponseSerializer serializer];
});
return _instance;
}
@end
在控制器中拖入一個(gè)UIWebView試圖,通過連線方式連接到控制器中
#import "ViewController.h"
#import "NetWorkTool.h"
@interface ViewController ()
//WebView
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self loadWebView];
}
- (void)loadWebView{
//1.獲取我們NetWorkTool的單例
NetWorkTool *netWorkTool = [NetWorkTool sharedNetWorkTool];
//2.發(fā)送GET請(qǐng)求 //html
__weak typeof(self) weakSelf = self;
[netWorkTool GET:@"http://www.baidu.com" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
NSLog(@"result===%@----%@",responseObject,[NSThread currentThread]);
//再將我們返回的二進(jìn)制,轉(zhuǎn)成我們字符串,反序列化
NSString *html = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
//在主線程更新UI
[weakSelf.webView loadHTMLString:html baseURL:[NSURL URLWithString:@"http://www.baidu.com"]];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error===%@",[error localizedDescription]);
}];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
- AFNetworking之聯(lián)網(wǎng)檢測(cè)
聯(lián)網(wǎng)檢測(cè)對(duì)應(yīng)狀態(tài)
AFNetworkReachabilityStatusUnknown = -1, //未知的狀態(tài)
AFNetworkReachabilityStatusNotReachable = 0, //不能聯(lián)網(wǎng)
AFNetworkReachabilityStatusReachableViaWWAN = 1, //流量
AFNetworkReachabilityStatusReachableViaWiFi = 2, //wifi
//點(diǎn)擊屏幕的時(shí)候開始檢測(cè)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%ld",status);
}];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
}
- AFNetworking之上傳文件
//點(diǎn)擊屏幕的時(shí)候上傳文件
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//獲取基于NSURLSession的管理器
AFHTTPSessionManager *manager=[AFHTTPSessionManager manager];
//上傳文件
NSDictionary *param=@{@"status":@"this is test"};
[manager POST:@"http://localhost/post/upload-m.php" parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
//獲取文件1
NSURL *url1=[[NSBundle mainBundle]URLForResource:@"01.jpg" withExtension:nil];
[formData appendPartWithFileURL:url1 name:@"userfile[]" fileName:@"01.jpg" mimeType:@"image/png" error:NULL];
//獲取文件2
NSURL *url2=[[NSBundle mainBundle]URLForResource:@"02.jpg" withExtension:nil];
NSData *data2=[NSData dataWithContentsOfURL:url2];
//[formData appendPartWithFileData:data2 name:@"userfile[]" fileName:@"02.jpg" mimeType:@"image/png"];
//application/octet-stream通用格式
[formData appendPartWithFileData:data2 name:@"userfile[]" fileName:@"02.jpg" mimeType:@"application/octet-stream"];
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
NSLog(@"responseObject--->%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error---->%@",error);
}];
}