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