導語:
眾所周知,AFNetworking是目前IOS開發中非常受歡迎的第三方網絡通信類庫,同時AFNetworking對蘋果官方NSURLConnection和NSURLSession進行了封裝,使用起來可以說是簡單的"令人發指".
AFNetworking有關請求與響應的信息
?請求:(序列化)??
AFURLRequestSerialization? ?
AFHTTPRequestSerializer(默認)傳輸的就是二進制
AFJSONRequestSerializer傳輸入的二進制是一個JSON格式的二進制 ,只有NSArray, NSDictionay;
AFPropertyListRequestSerializer 傳輸的到時候是一個plist,這個不玩意兒不用,因為他不通用
響應:(反序列化)
?AFHTTPResponseSerializer//返回的就一個純潔的二進制
AFJSONResponseSerializer(默認)返回的是一個JSON格式的二進制,并且AFN幫我們自動序列化成了字典或是數組
AFXMLParserResponseSerializerXMLParser
AFXMLDocumentResponseSerializer (Mac OS X) 不適合我們的iOS
AFPropertyListResponseSerializer plist
AFImageResponseSerializer ? ? ? ? ?//國片
AFCompoundResponseSerializer //混合
使用AFNetworking
GET方法
//1.首先創建一個管理者
AFHTTPRequestOperationManager ?*manager = [AFHTTPRequestOperationManager manager];
//2.發送請求
//在使用AFN的時候,直接傳遞我們url的字符串就可以了
//AFN在反序列化的時候,默認是幫我們按照JSON的格式去解析
[ manager ?GET: @"http://localhost/test.json"? parameters: nil? ?success: ^(AFHTTPRequestOperation * Nonnull operation ,id_Nonnull responseObject) {
? ? ? //第一個參數 operation 操作
? ? ? //第二個參數 responseObject
? ? ? ?NSLog(@"%@---%@",responseObject,[responseObject class]);
? ? ? } failure: ^(AFHTTPRequestOperation * _Nullable operation ,NSError* Nonnull ? ? error) {
? ? ? ? ? ?NSLog(@"%@",error);
? }];
POST方法:
// 1.創建一個基于NSURLConnection的管理
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager ?manager ];
//2.發送我們的POST請求
//用戶名密碼
NSDictionary *param = @ { @"username": @"admin" , @"password": @"123" };
//登陸到得網址
[ manager POST: @"http://localhost/login.php" parameters:params success:^(AFHTTPRequestOperation * _Nonnull operation,id_Nonnull responseObject) { ? //請求成功
? ? ? ? NSLog(@"post result====%@---%@",responseObject,[responseObject class]);
? ? ? ?} failure:^(AFHTTPRequestOperation * _Nullable operation,NSError* _Nonnull error) { ? //請求失敗
? ? ? ? NSLog(@"%@",error); ?//打印錯誤信息
}];
#### *AFNetworking之搭配webView使用*
注意:因為默認情況下AFNetworking的響應解析方式都是按照JOSN解析,所以我們需要修改AFNetworking的解析方式,但是為了以后使用方便,我們不在AFNetworking基礎上修改,我們添加一個類繼承自AFHTTPSessionManager然后創建一個單例,這樣以后AFNetworking更新,我們的代碼也不會因此受到影響.
首先創建NetWorkTool類,并創建單例方法
#import "AFHTTPSessionManager.h"
@interfaceNetWorkTool:AFHTTPSessionManager
//單例
+ (instancetype) sharedNetWorkTool;
@end
實現單例方法
#import "NetWorkTool.h"
@implementation ?NetWorkTool
? ? ?staticNetWorkTool *_instance;
?+? (instancetype)sharedNetWorkTool { ? //使用GCD
? ? ? static ?dispatch_once_ tonceToken;?
? ? ? dispatch_once(&onceToken, ^{
? ? ? ? ? ? _instance = [[NetWorkTool alloc] initWithBaseURL: nil];
? ? ? ? ? ? _instance.responseSerializer.acceptableContentTypes = [NSSet setWithObjects: @"application/json", @"text/json", @"text/javascript", @"text/html" , nil ];
? ? //默認情況下的響應解析方式,就是不管服務器給我們返回的是什么,都按照JSON去解析
? ? //將默認的JSON序列化方式,改成我們最普通的二進制
? ? _instance.responseSerializer = [AFHTTPResponseSerializer serializer];
? ? ? });
? ? ? ?return_instance;
}
@end
在控制器中拖入一個UIWebView試圖,通過連線方式連接到控制器中
#import "ViewController.h"
#import "NetWorkTool.h"
@interface ?ViewController()
//WebView
@property (weak ,nonatomic) IBOutlet ?UIWebView ?*webView;
@end
@implementation ?ViewController
- (void) viewDidLoad {
? ? ? ? [superview ?DidLoad];
? ? ? ? [self ?loadWebView];
}
- (void) loadWebView {
? ? ? //1.獲取我們NetWorkTool的單例
? ? ? ?NetWorkTool *netWorkTool = [NetWorkTool sharedNetWorkTool];
? ? ? //2.發送GET請求//html
? ? ? __weaktypeof(self) weakSelf = self;?
? ? ? ?[netWorkTool ?GET: @"http://www.baidu.com"
? ? ? ? ? ? ? ? ? parameters: nil
? ? ? ? ? ? ? ? ? ? ? ?success: ^(NSURLSessionDataTask* _Nonnull task , id_Nonnull responseObject) {
? ? ? ? ? ? ? NSLog(@"result===%@----%@",responseObject , [NSThread currentThread]);
? ? ?//再將我們返回的二進制,轉成我們字符串,反序列化
? ? NSString *html = [[NSString ?alloc] initWithData: responseObject ?encoding: NSUTF8StringEncoding];
? ? //在主線程更新UI
? ?[weakSelf.webView ?loadHTMLString: html baseURL: [NSURLURLWithString: @"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之聯網檢測
聯網檢測對應狀態
AFNetworkReachabilityStatusUnknown ? ? ? ? ? ? ? ? = -1, ?//未知的狀態
AFNetworkReachabilityStatusNotReachable ? ? ? ? ? = 0, ?//不能聯網
AFNetworkReachabilityStatusReachableViaWWAN ?= 1, ?//流量
AFNetworkReachabilityStatusReachableViaWiFi ? ? = 2, ?//wifi
//點擊屏幕的時候開始檢測
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{
[[AFNetworkReachabilityManager ?sharedManager] setReachabilityStatusChangeBlock: ^(AFNetworkReachabilityStatus status) {
? ? ? ? ? NSLog(@"%ld",status);
? ? }];
? ? ? ? ? [[AFNetworkReachabilityManager sharedManager] startMonitoring];
}
AFNetworking之上傳文件
//點擊屏幕的時候上傳文件
- (void)touchesBegan:(NSSet *)toucheswithEvent:(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_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);
? ? }];
}