一、2大管理對(duì)象
1.AFHTTPRequestOperationManager
* 對(duì)NSURLConnection的封裝
2.AFHTTPSessionManager
* 對(duì)NSURLSession的封裝
二、AFHTTPRequestOperationManager的具體使用
1.創(chuàng)建管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
2.封裝請(qǐng)求參數(shù)
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"username"] = @"哈哈哈";
params[@"pwd"] = @"123";
3.發(fā)送請(qǐng)求
NSString *url = @"http://localhost:8080/MJServer/login";
[mgr POST:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 請(qǐng)求成功的時(shí)候調(diào)用這個(gè)block
NSLog(@"請(qǐng)求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 請(qǐng)求失敗的時(shí)候調(diào)用調(diào)用這個(gè)block
NSLog(@"請(qǐng)求失敗");
}];
// GET請(qǐng)求
[mgr GET:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 請(qǐng)求成功的時(shí)候調(diào)用這個(gè)block
NSLog(@"請(qǐng)求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 請(qǐng)求失敗的時(shí)候調(diào)用調(diào)用這個(gè)block
NSLog(@"請(qǐng)求失敗");
}];
三、對(duì)服務(wù)器返回?cái)?shù)據(jù)的解析
1.AFN可以自動(dòng)對(duì)服務(wù)器返回的數(shù)據(jù)進(jìn)行解析
* 默認(rèn)將服務(wù)器返回的數(shù)據(jù)當(dāng)做JSON來(lái)解析
2.設(shè)置對(duì)服務(wù)器返回?cái)?shù)據(jù)的解析方式
1> 當(dāng)做是JSON來(lái)解析(默認(rèn)做法)
* mgr.responseSerializer = [AFJSONResponseSerializer serializer];
* responseObject的類型是NSDictionary或者NSArray
2> 當(dāng)做是XML來(lái)解析
* mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
* responseObject的類型是NSXMLParser
3> 直接返回data
* 意思是:告訴AFN不要去解析服務(wù)器返回的數(shù)據(jù),保持原來(lái)的data即可
* mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
3.注意
* 服務(wù)器返回的數(shù)據(jù)一定要跟responseSerializer對(duì)得上
1> 服務(wù)器返回的是JSON數(shù)據(jù)
* AFJSONResponseSerializer
* AFHTTPResponseSerializer
2> 服務(wù)器返回的是XML數(shù)據(jù)
* AFXMLParserResponseSerializer
* AFHTTPResponseSerializer
3> 服務(wù)器返回的是其他數(shù)據(jù)
* AFHTTPResponseSerializer
四.AFN 的使用 ?
重點(diǎn): 掌握 AFN 發(fā)送網(wǎng)絡(luò)請(qǐng)求的方法.
{
AFN 是最常用的網(wǎng)絡(luò)框架, AFN 內(nèi)部封裝了 NSURLConnection 和 NSURLSession
其中:
AFHTTPRequestOperationManager 是對(duì) NSURLConnection 的封裝;
AFHTTPSessionManager 是對(duì) NSURLSession 的封裝.
AFN 的使用非常簡(jiǎn)單:
總共分為兩步: 1. 創(chuàng)建網(wǎng)絡(luò)請(qǐng)求管理者; 2. 封裝請(qǐng)求參數(shù); 3.發(fā)送請(qǐng)求.
// 1. 創(chuàng)建網(wǎng)絡(luò)請(qǐng)求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 2. 封裝請(qǐng)求參數(shù)
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"username"] = @"zhangsan";
params[@"password"] = @"zhang";
// 3. 發(fā)送網(wǎng)絡(luò)請(qǐng)求 ,AFN 中最常用的兩個(gè)請(qǐng)求就是 GET 請(qǐng)求 和 POST 請(qǐng)求
{
// GET請(qǐng)求
[mgr GET:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 請(qǐng)求成功的時(shí)候調(diào)用這個(gè)block
NSLog(@"請(qǐng)求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 請(qǐng)求失敗的時(shí)候調(diào)用調(diào)用這個(gè)block
NSLog(@"請(qǐng)求失敗");
}];
// POST請(qǐng)求
[mgr POST:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 請(qǐng)求成功的時(shí)候調(diào)用這個(gè)block
NSLog(@"請(qǐng)求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 請(qǐng)求失敗的時(shí)候調(diào)用調(diào)用這個(gè)block
NSLog(@"請(qǐng)求失敗");
}];
}
}
五. AFN 數(shù)據(jù)解析 ?
重點(diǎn): 針對(duì)不同的網(wǎng)絡(luò)請(qǐng)求,設(shè)置不同的數(shù)據(jù)解析器
{
<1> AFN 可以自動(dòng)對(duì)服務(wù)器返回的數(shù)據(jù)進(jìn)行解析,默認(rèn)將服務(wù)器返回的數(shù)據(jù)當(dāng)做 JSON 數(shù)據(jù)解析.
必須按照服務(wù)器返回的數(shù)據(jù)格式,選擇不同的解析器.不然,就會(huì)報(bào)錯(cuò),得不到想要的數(shù)據(jù).
{
// 創(chuàng)建網(wǎng)絡(luò)請(qǐng)求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 1. 默認(rèn)情況下,網(wǎng)絡(luò)請(qǐng)求的管理者的解析器如下:
// 由于返回的是 JSON 數(shù)據(jù),所以從服務(wù)器返回的數(shù)據(jù):responseObject 的類型是 NSDictionary 或者 NSArray
mgr.responseSerializer = [AFJSONResponseSerializer serializer];
// 2. 如果服務(wù)器返回的是 XML 數(shù)據(jù),那么必須設(shè)置網(wǎng)絡(luò)請(qǐng)求管理者的解析器類型如下:
// 這時(shí),服務(wù)器返回的數(shù)據(jù) responseObject 的數(shù)據(jù)類型是 NSXMLParser
mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
// 3. 如果服務(wù)器返回的是 data(比如:文件數(shù)據(jù)),這時(shí)需要告訴 AFN 不要去解析服務(wù)器返回的數(shù)據(jù),保持原來(lái)的 data 數(shù)據(jù)就可以了.
mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
}
<2> 需要特別注意的是,服務(wù)器返回的數(shù)據(jù)一定要跟 responseSerializer 相對(duì)應(yīng).對(duì)應(yīng)關(guān)系如下:
{
1> 服務(wù)器返回的是JSON數(shù)據(jù)
* AFJSONResponseSerializer
* AFHTTPResponseSerializer
2> 服務(wù)器返回的是XML數(shù)據(jù)
* AFXMLParserResponseSerializer
* AFHTTPResponseSerializer
3> 服務(wù)器返回的是其他數(shù)據(jù)
* AFHTTPResponseSerializer
}
}
六,AFN和ASI的區(qū)別
一、底層實(shí)現(xiàn)
1> AFN的底層基于OC的NSURLConnection和NSURLSession
2> ASI的底層基于純C語(yǔ)言的CFNetwork框架
3> ASI的運(yùn)行性能 高于 AFN
二、對(duì)服務(wù)器返回的數(shù)據(jù)處理
1> ASI沒(méi)有直接提供對(duì)服務(wù)器數(shù)據(jù)處理的方式,直接返回data\string
2> AFN提供了多種對(duì)服務(wù)器數(shù)據(jù)處理的方式
* JSON處理
* XML處理
* 其他處理
三、監(jiān)聽(tīng)請(qǐng)求的過(guò)程
1> AFN提供了success和failure兩個(gè)block來(lái)監(jiān)聽(tīng)請(qǐng)求的過(guò)程(只能監(jiān)聽(tīng)成功和失?。?/p>
* success : 請(qǐng)求成功后調(diào)用
* failure : 請(qǐng)求失敗后調(diào)用
2> ASI提供了3套方案,每一套方案都能監(jiān)聽(tīng)請(qǐng)求的完整過(guò)程
(監(jiān)聽(tīng)請(qǐng)求開(kāi)始、接收到響應(yīng)頭信息、接受到具體數(shù)據(jù)、接受完畢、請(qǐng)求失敗)
* 成為代理,遵守協(xié)議,實(shí)現(xiàn)協(xié)議中的代理方法
* 成為代理,不遵守協(xié)議,自定義代理方法
* 設(shè)置block
四、在文件下載和文件上傳的使用難易度
1> AFN
* 不容易監(jiān)聽(tīng)下載進(jìn)度和上傳進(jìn)度
* 不容易實(shí)現(xiàn)斷點(diǎn)續(xù)傳
* 一般只用來(lái)下載不大的文件
2> ASI
* 非常容易實(shí)現(xiàn)下載和上傳
* 非常容易監(jiān)聽(tīng)下載進(jìn)度和上傳進(jìn)度
* 非常容易實(shí)現(xiàn)斷點(diǎn)續(xù)傳
* 下載或大或小的文件都行
五、ASI提供了更多的實(shí)用功能
1> 控制圈圈要不要在請(qǐng)求過(guò)程中轉(zhuǎn)
2> 可以輕松地設(shè)置請(qǐng)求之間的依賴:每一個(gè)請(qǐng)求都是一個(gè)NSOperation對(duì)象
3> 可以統(tǒng)一管理所有請(qǐng)求(還專門提供了一個(gè)叫做ASINetworkQueue來(lái)管理所有的請(qǐng)求對(duì)象)
* 暫停\恢復(fù)\取消所有的請(qǐng)求
* 監(jiān)聽(tīng)整個(gè)隊(duì)列中所有請(qǐng)求的下載進(jìn)度和上傳進(jìn)度