AFNetworking是一個(gè)令人愉快的iOS和Mac OS X的網(wǎng)絡(luò)庫。它建立在基礎(chǔ)URL加載系統(tǒng)之上坪它,擴(kuò)展了Cocoa中內(nèi)置的強(qiáng)大的高級(jí)網(wǎng)絡(luò)抽象猖吴。它有一個(gè)模塊化架構(gòu)烁挟,設(shè)計(jì)良好吩翻,功能豐富的API兜看,使用起來很方便。
- AFN的簡介
- 簡介
- 請(qǐng)求數(shù)據(jù)格式
- 響應(yīng)數(shù)據(jù)格式
- 數(shù)據(jù)格式小結(jié)
- AFN模擬登陸
- 發(fā)送GET請(qǐng)求獲取普通的Json數(shù)據(jù)
- AFN發(fā)送GET請(qǐng)求模擬登陸
- AFN發(fā)送POST請(qǐng)求模擬登陸
- AFN常見錯(cuò)誤
- AFN實(shí)現(xiàn)文件上傳和下載
- 文件上傳
- 文件下載
- AFN常用功能
- AFN之BaseURL
- AFN之HTTPS
- AFN之監(jiān)測網(wǎng)絡(luò)環(huán)境
- 封裝簡單的網(wǎng)絡(luò)請(qǐng)求工具類
AFN的簡介
簡介
- 目前國內(nèi)開發(fā)網(wǎng)絡(luò)應(yīng)用使用最多的第三方框架
- 是專為
Mac OS
和iOS
設(shè)計(jì)的一套網(wǎng)絡(luò)框架 - 對(duì)
NSURLConnection
和NSURLSession
做了封裝 - 提供有豐富的API
- 提供了完善的錯(cuò)誤解決方案
- 使用起來相對(duì)來說比較簡單
- 官網(wǎng)地址:AFNetworking
請(qǐng)求數(shù)據(jù)格式
AFURLRequestSerialization
| 類型 | 說明 |
| --- | :---: | ---:|
| AFHTTPRequestSerializer
| 二進(jìn)制的狭瞎,默認(rèn)的 |
| AFJSONRequestSerializer
| JSON(POST JSON) RESTful 設(shè)計(jì)風(fēng)格需要 |
| AFPropertyListRequestSerializer
| PList(POST Plist-開發(fā)中幾乎不用) |
響應(yīng)數(shù)據(jù)格式
AFURLResponseSerialization
| 類型 | 說明 |
| --- | :---: | ---:|
| AFHTTPResponseSerializer
| HTTP二進(jìn)制的 |
| AFJSONResponseSerializer
| JSON默認(rèn)的 |
| AFXMLParserResponseSerializer
| XML Parser解析器 SAX解析 |
| AFXMLDocumentResponseSerializer
| (Mac OS X) XML DOM |
| AFPropertyListResponseSerializer
| PList幾乎不用 |
| AFImageResponseSerializer
| 圖像细移,不支持GIF |
| AFCompoundResponseSerializer
| 組合的 |
數(shù)據(jù)格式小結(jié)
- 大多數(shù)情況下,都是
JSON
格式熊锭,不需要指定 - 如果是
XML
格式- 如果
SAX
解析弧轧,需要指定格式manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
- 然后利用代理方法解析
- 如果
DOM
解析,需要指定格式manager.responseSerializer = [AFHTTPResponseSerializer serializer];
- 然后利用第三方框架解析
- 如果
- 圖像
-
AFN
支持圖像緩存 - 但是不支持
GIF
-
- 提示
- 使用
AFN
時(shí)碗殷,一定記住要輸出:error
- 使用
AFN模擬登陸
導(dǎo)入頭文件:
#import "AFNetworking.h
發(fā)送GET請(qǐng)求獲取普通的JSON數(shù)據(jù)
- (IBAction)demo:(id)sender
{
// 1.網(wǎng)絡(luò)請(qǐng)求地址
NSString *URLString = @"http://xxxx/demo.json";
// 2.創(chuàng)建網(wǎng)絡(luò)請(qǐng)求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 3.發(fā)送網(wǎng)絡(luò)請(qǐng)求
[manager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@ %@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
}
AFN發(fā)送GET請(qǐng)求模擬登陸
- (IBAction)GETLogin:(id)sender {
// NSString *URLString = @"http://xxxx/php/login/login.php?username=zhangsan&password=zhang";
// 登陸地址
NSString *URLString = @"http://xxxx/php/login/login.php";
// 網(wǎng)絡(luò)請(qǐng)求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 請(qǐng)求參數(shù)
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
parameters[@"username"] = @"zhangsan";
parameters[@"password"] = @"zhang";
// 發(fā)送GET請(qǐng)求
[manager GET:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
}
AFN發(fā)送POST請(qǐng)求模擬登陸
- (IBAction)POSTLogin:(id)sender {
// 登陸地址
NSString *URLString = @"http://xxxx/php/login/login.php";
// 網(wǎng)絡(luò)請(qǐng)求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 請(qǐng)求參數(shù)
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
parameters[@"username"] = @"zhangsan";
parameters[@"password"] = @"zhang";
// 發(fā)送POST請(qǐng)求
[manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
}
AFN常見錯(cuò)誤
AFN常見的序列化和反序列化的錯(cuò)誤
1.常見錯(cuò)誤一 :
AFN支持接收 @"application/json", @"text/json", @"text/javascript" 文本類型
AFN不支持接收 text/html 文本類型
2.常見錯(cuò)誤二 :
AFN默認(rèn)的成功的回調(diào) responseObject 是把服務(wù)器返回的數(shù)據(jù)當(dāng)做JSON數(shù)據(jù)格式解析,返回字典或者數(shù)組.
但是在加載網(wǎng)頁數(shù)據(jù)時(shí),響應(yīng)體是字符串.需要修改響應(yīng)的序列化方式,讓AFN給我們返回原始的二進(jìn)制數(shù)據(jù)即可.
3.常見錯(cuò)誤三 :
AFN不支持接收 text/plian 文本類型
4.常見錯(cuò)誤四 :
AFN默認(rèn)只支持向服務(wù)器發(fā)送普通的二進(jìn)制數(shù)據(jù).比如普通的GET和POST請(qǐng)求數(shù)據(jù).默認(rèn)不支持發(fā)送JSON數(shù)據(jù)到服務(wù)器
如果要向服務(wù)器發(fā)送JSON格式的二進(jìn)制數(shù)據(jù),就需要特殊的處理請(qǐng)求的方式.使AFN支持向服務(wù)器發(fā)送JSON形式的二進(jìn)制數(shù)據(jù)
其他常見錯(cuò)誤
- 加載網(wǎng)頁數(shù)據(jù)時(shí)
- (void)loadData
{
// 網(wǎng)絡(luò)請(qǐng)求manager
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 常見錯(cuò)誤一 : 修改AFN支持接收的文本類型 : text/html
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];
// 常見錯(cuò)誤二 : 修改AFN默認(rèn)的返回的數(shù)據(jù)類型,設(shè)置默認(rèn)為只返回原始的二進(jìn)制數(shù)據(jù),程序猿自己解析
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 網(wǎng)絡(luò)請(qǐng)求地址
NSString *URLStr = @"http://www.baidu.com";
// 發(fā)送網(wǎng)絡(luò)請(qǐng)求
[manager GET:URLStr parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// NSLog(@"%@ %@",[responseObject class],responseObject);
NSString *html = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"%@",html);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"出錯(cuò) %@",error);
}];
}
- 向服務(wù)器發(fā)送JSON數(shù)據(jù)時(shí)
- (void)postJSON
{
// 網(wǎng)絡(luò)請(qǐng)求manager
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 常見錯(cuò)誤三 : 修改AFN支持接收的文本類型 : text/plian
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/plain", nil];
// 常見錯(cuò)誤二 : 修改AFN默認(rèn)的返回的數(shù)據(jù)類型,設(shè)置默認(rèn)為只返回原始的二進(jìn)制數(shù)據(jù),程序猿自己解析
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 常見錯(cuò)誤四 : 修改AFN支持向服務(wù)器發(fā)送JSON形式的二進(jìn)制數(shù)據(jù)
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// 網(wǎng)絡(luò)請(qǐng)求地址
NSString *URLStr = @"http://localhost/php/upload/postjson.php";
// 請(qǐng)求參數(shù)
NSDictionary *parameters = @{
@"name":@"zhangsan"
};
// 發(fā)送網(wǎng)絡(luò)請(qǐng)求
[manager POST:URLStr parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// NSLog(@"%@ %@",[responseObject class],responseObject);
NSString *html = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"%@",html);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"出錯(cuò) %@",error);
}];
}
AFN實(shí)現(xiàn)文件上傳和下載
文件上傳
-
文件數(shù)據(jù)拼接的方法
[formData appendPartWithFileData:data name:@"" fileName:@"" mimeType:@""];
-
文件數(shù)據(jù)拼接的四個(gè)參數(shù)
- 參數(shù)1:上傳文件的二進(jìn)制信息
- 參數(shù)2:服務(wù)器接收二進(jìn)制數(shù)據(jù)的字段名(跟服務(wù)器要)
- 參數(shù)3:文件保存到服務(wù)器的名字
- 參數(shù)4:上傳的文件的類型
文件上傳的主方法
- (void)uploadFile
{
// 網(wǎng)絡(luò)請(qǐng)求地址
NSString *URLStr = @"http://xxxx/php/upload/upload-m.php";
// 文件上傳的附帶信息
NSDictionary *textDict = @{
@"status":@"zhangsan"
};
// 網(wǎng)絡(luò)請(qǐng)求manager
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 發(fā)送POST請(qǐng)求
[manager POST:URLStr parameters:textDict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// 獲取文件路徑1
NSString *filePath1 = [[NSBundle mainBundle] pathForResource:@"mm01.jpg" ofType:nil];
NSData *fileData1 = [NSData dataWithContentsOfFile:filePath1];
// 拼接數(shù)據(jù)1
[formData appendPartWithFileData:fileData1 name:@"userfile[]" fileName:[filePath1 lastPathComponent] mimeType:@"image/jpg"];
// 獲取文件路徑2
NSString *filePath2 = [[NSBundle mainBundle] pathForResource:@"mm02.jpg" ofType:nil];
NSData *fileData2 = [NSData dataWithContentsOfFile:filePath2];
// 拼接數(shù)據(jù)2
[formData appendPartWithFileData:fileData2 name:@"userfile[]" fileName:[filePath2 lastPathComponent] mimeType:@"image/jpg"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"進(jìn)度 %f",uploadProgress.fractionCompleted);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@ %@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"出錯(cuò) %@",error);
}];
}
文件下載
- (void)downloadFile
{
// 下載地址
NSString *URLString = @"http://xxxx/xcode.zip";
// 請(qǐng)求
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]];
// 管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 發(fā)起下載任務(wù)
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"進(jìn)度 %f",downloadProgress.fractionCompleted);
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
// AFN提供的文件保存路徑,在tmp文件中,下載完成之后就會(huì)被刪除
NSLog(@"%@",targetPath);
// 自己獲取文件保存的路徑
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
// 帶file:// 協(xié)議頭
NSURL *locationURL = [NSURL fileURLWithPath:filePath];
// 把文件緩存路徑剪切出去
return locationURL;
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
// 文件最終保存的路徑 : 從上面自動(dòng)剪切過來的
NSLog(@"%@",filePath.path);
}];
// 開啟下載任務(wù)
[downloadTask resume];
}
AFN其他常用功能
AFN之BaseURL
- 使用場景:設(shè)計(jì)網(wǎng)絡(luò)請(qǐng)求工具類時(shí)使用
- (IBAction)baseURL:(id)sender
{
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://localhost/"]];
[manager GET:@"demo.json" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
}
AFN之HTTPS
// 允許無效的證書 : 2.5.4 版本之前使用
manager.securityPolicy.allowInvalidCertificates = YES;
// 不驗(yàn)證域名 : 2.6.0 版本之后使用
manager.securityPolicy.validatesDomainName = NO;
- (IBAction)HTTPS:(id)sender
{
// 創(chuàng)建網(wǎng)絡(luò)請(qǐng)求mansger
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 允許無效的證書
// manager.securityPolicy.allowInvalidCertificates = YES;
// 不驗(yàn)證域名
manager.securityPolicy.validatesDomainName = NO;
// 修改AFN默認(rèn)支持接收的文本類型
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html" ,nil];
// 修改AFN默認(rèn)處理數(shù)據(jù)的方式 : 設(shè)置成只返回原始的二進(jìn)制數(shù)據(jù),程序猿自己反序列化
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 網(wǎng)絡(luò)請(qǐng)求地址
NSString *URLStr = @"https://www.baidu.com";
[manager GET:URLStr parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// NSLog(@"%@ %@",[responseObject class],responseObject);
// 反序列化
NSString *html = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"%@",html);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"出錯(cuò) %@",error);
}];
}
AFN之監(jiān)測網(wǎng)絡(luò)環(huán)境
- 程序一啟動(dòng)就開始監(jiān)測網(wǎng)絡(luò)環(huán)境
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 監(jiān)測網(wǎng)絡(luò)環(huán)境
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
/*
status
AFNetworkReachabilityStatusUnknown = -1, 不知道監(jiān)測的是什么
AFNetworkReachabilityStatusNotReachable = 0, 沒有檢測到網(wǎng)絡(luò)
AFNetworkReachabilityStatusReachableViaWWAN = 1, 蜂窩網(wǎng)
AFNetworkReachabilityStatusReachableViaWiFi = 2, WIFI
*/
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%zd",status);
}];
[manager startMonitoring];
return YES;
}
封裝簡單的網(wǎng)絡(luò)請(qǐng)求工具類
新建類 NetworkTool
NetworkTool.h
// 第一步 : 繼承自 AFHTTPSessionManager
@interface NetworkTool : AFHTTPSessionManager
/**
* 網(wǎng)絡(luò)請(qǐng)求工具類全局訪問點(diǎn)
*
* @return AFHTTPSessionManager的實(shí)例
*/
+ (instancetype)sharedNetworkTool;
/**
* 網(wǎng)絡(luò)請(qǐng)求工具類GET請(qǐng)求的主方法
*
* @param URLString 請(qǐng)求地址
* @param success 成功的回調(diào)
* @param faile 失敗的回調(diào)
*/
- (void)GETWithURLString:(NSString *)URLString success:(void(^)(id responseObject))success faile:(void(^)(NSError *error))faile;
NetworkTool.m
+ (instancetype)sharedNetworkTool
{
static NetworkTool *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 設(shè)置相對(duì)路徑
NSURL *BaseURL = [NSURL URLWithString:@"http://c.m.163.com/nc/"];
// 實(shí)例化Manager
instance = [[self alloc] initWithBaseURL:BaseURL];
// 增加AFN支持的文件類型
instance.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/plain", nil];
});
return instance;
}
// 網(wǎng)絡(luò)工具類實(shí)現(xiàn)GET請(qǐng)求的主方法
- (void)GETWithURLString:(NSString *)URLString success:(void (^)(id))success faile:(void (^)(NSError *))faile
{
[self GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (faile) {
faile(error);
}
}];
}
感謝讀到最后的朋友精绎,最后祝大家工作順利,請(qǐng)點(diǎn)贊支持一下锌妻,謝謝代乃!