iOS AFNetworking網絡框架詳解

AFNetworking使用詳解

導語:

眾所周知,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);

? ? }];

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容