AFNetworking簡介
#import "AFURLRequestSerialization.h"//設定請求頭的資訊也就是請求的方式
#import "AFURLResponseSerialization.h"//設定響應頭的資訊
#import "AFSecurityPolicy.h"//封裝了證書驗證的過程
#import "AFNetworkReachabilityManager.h"//網路監測
#import "AFURLSessionManager.h"//網路請求,更偏向於網路上傳和下載
#import "AFHTTPSessionManager.h"//網路請求,偏向於請求資料
複製程式碼
AFNetworking是一個輕量級的網路請求API類庫,是以NSURLConnection,NSOperation和其他方法為基礎的。 AFNetworking3.0目前使用NSURLSesion作為網路類 核心類:AFHTTPSessionManager 針對 HTTP 細化了不同型別的請求操作( GET、HEAD、POST、PUT、PATCH、DELETE)
GET請求
在我們需要進行GET請求的時候我們只需要如下的一個方法就可以完成網路請求。
- GET:介面網址
- parameters:請求引數
- progress:如果是下載資料的話,下載進度
- success:資料請求成功的block回撥
- failure:資料請求失敗的回撥
- (nullable NSURLSessionDataTask*)GET:(NSString *)URLString
parameters:(nullable id)parameters
progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress
success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
複製程式碼
- 在進行網路請求的時候我們首先需要一個網路請求的回話管理物件。 這個類是網路請求的核心類。
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
複製程式碼
- 設定響應資料的格式
- AFHTTPResponseSerializer 返回的資料型別為二進位制型別
- AFJSONResponseSerializer 返回資料型別為json串
- AFXMLParserResponseSerializer xml型別
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
複製程式碼
- 實現GET請求的方法
[manager GET:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"
parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
if (dic) {
//將解析出來的資料轉換成JSON串。方便我們列印觀看。
if ([NSJSONSerialization isValidJSONObject:dic]) {
NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
NSString *printStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",printStr);
}
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"請求失敗");
}];
複製程式碼
POST請求
方法的引數和上面GET請求的引數類似
- 我們需要一個網路請求的回話管理物件
AFHTTPSessionManager *manage = [AFHTTPSessionManager manager];
複製程式碼
- 設定響應資料的格式,三種相應方式在GET請求中已經介紹了
anage.responseSerializer = [AFHTTPResponseSerializer serializer];
複製程式碼
- 設定引數,將引數設定成字典的形式。然後在方法中傳入一個字典,也可以是直接在方法中將引數以字串的形式傳入。
NSDictionary *dic = @{@"date":@"20151031",@"startRecord":@"1",@"len":@"5",@"udid":@"1234567890",
@"terminalType":@"Iphone",@"cid":@"213"};
複製程式碼
- 實現POST請求的方法
[manage POST:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"
parameters:dic constructingBodyWithBlock:nil progress:nil success:
^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//在這裡就已經獲得了我們請求回來的資料了。
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
if ([NSJSONSerialization isValidJSONObject:dic]) {
NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//列印當前的執行緒
NSLog(@"%@ %@",string,[NSThread currentThread]);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error.description);
}];
複製程式碼
以上就是使用AFNetWorking進行GET請求和POST請求的步驟
網路監測
當我們只需要在應用程式的一個地方監測網路狀態的時候,我們可以按照一下步驟來執行操作
- 我們需要一個網路監測的物件,在這裡我們也可以使用AFHTTPSessionManager
AFNetworkReachabilityManager *reachability = [AFNetworkReachabilityManager sharedManager];
複製程式碼
- 啟動網路監測
[reachability startMonitoring];
複製程式碼
- 實現網路監測的方法,當網路環境發生改變的時候,會執行block回撥。
[reachability setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知狀態");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"無網路連結");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G 或者 4G狀態");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"11WIFI狀態");
break;
default:
break;
}
}];
複製程式碼
當我們需要在一個應用程式的多個地方使用到網路監測的時候 ,我們可以在AppDelegate使用通知中心的方法將網路的狀態傳遞過來
- 首先建立一個網路監測的物件
AFNetworkReachabilityManager *reachabilty = [AFNetworkReachabilityManager sharedManager];
複製程式碼
- 開啟網路監測
[reachabilty startMonitoring];
複製程式碼
- 實現一個監聽的方法,在方法的內部使用通知中心將網路的狀態傳送出去
[reachabilty setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
//告知網路發生變化的時候,我們傳送訊息通知,告知需要此訊息的物件。
[[NSNotificationCenter defaultCenter]postNotificationName:kNetStatus object:@(status)];
}];
複製程式碼
- 在我們需要監測網路狀態的地方新增一個觀察者,用來觀察網路的的變化
[[NSNotificationCenter defaultCenter]addObserver:
self selector:@selector(netChange:) name:kNetStatus object:nil];
複製程式碼
- 觀察者的回撥方法
-(void)netChange:(NSNotification *)notification{
//取出網路狀態
AFNetworkReachabilityStatus status = [notification.object intValue];
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知狀態");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"無網路連結");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G 或者 4G狀態");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI狀態");
break;
default:
break;
}
}
複製程式碼
以上的網路監聽,當我們只需要在一個地方監聽網路的狀態的時候,我們可以按照第一種的步驟來做,當需要在多個地方監聽網路的狀態的時候,我們就可以在AppDelegate中監聽網路的狀態,然後通過通知中心傳值的方式,將網路的狀態傳遞到,我們需要的地方。