AFN簡(jiǎn)介
目前國(guó)內(nèi)開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用使用最多的第三方框架
是專為 Mac OS & iOS 設(shè)計(jì)的一套網(wǎng)絡(luò)框架
對(duì) NSURLConnection 和 NSURLSession 做了封裝
提供有豐富的 API
提供了完善的錯(cuò)誤解決方案
使用簡(jiǎn)單
官網(wǎng)地址
https://github.com/AFNetworking/AFNetworking
使用
使用時(shí)導(dǎo)入頭文件 : #import "AFNetworking.h".
數(shù)據(jù)格式
請(qǐng)求的數(shù)據(jù)格式
AFURLRequestSerialization
類型和說(shuō)明
AFHTTPRequestSerializer 二進(jìn)制的腿时,默認(rèn)的
AFJSONRequestSerializer JSON(POST JSON) RESTful 設(shè)計(jì)風(fēng)格需要
AFPropertyListRequestSerializer PList(POST Plist-開(kāi)發(fā)中幾乎不用)
響應(yīng)數(shù)據(jù)格式
AFURLResponseSerialization
類型和說(shuō)明
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é)
大多情況下,都是 JSON格式,不需要指定.
如果是 XML 格式
如果 SAX 解析习绢,需要指定格式
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
然后利用代理方法解析
如果 DOM 解析伯复,需要指定格式
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
然后利用第三方框架解析
圖像
AFN 支持圖像緩存.
但是:不支持 GIF.
提示
使用 AFN 時(shí),一定記住輸出:error.
常見(jiàn)問(wèn)題
AFN常見(jiàn)的序列化和反序列化的錯(cuò)誤
1.常見(jiàn)錯(cuò)誤一 :
AFN支持接收 @"application/json", @"text/json", @"text/javascript" 文本類型
AFN不支持接收 text/html 文本類型
2.常見(jiàn)錯(cuò)誤二 :
AFN默認(rèn)的成功的回調(diào) responseObject 是把服務(wù)器返回的數(shù)據(jù)當(dāng)做JSON數(shù)據(jù)格式解析,返回字典或者數(shù)組.
但是在加載網(wǎng)頁(yè)數(shù)據(jù)時(shí),響應(yīng)體是字符串.需要修改響應(yīng)的序列化方式,讓AFN給我們返回原始的二進(jìn)制數(shù)據(jù)即可.
3.常見(jiàn)錯(cuò)誤三 :
AFN不支持接收 text/plian 文本類型
4.常見(jiàn)錯(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ù)
常見(jiàn)錯(cuò)誤一和常見(jiàn)錯(cuò)誤二
加載網(wǎng)頁(yè)數(shù)據(jù)時(shí)
- (void)loadData
{
// 網(wǎng)絡(luò)請(qǐng)求manager
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 常見(jiàn)錯(cuò)誤一 : 修改AFN支持接收的文本類型 : text/html
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];
// 常見(jiàn)錯(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);
}];
}
常見(jiàn)錯(cuò)誤三和常見(jiàn)錯(cuò)誤四
向服務(wù)器發(fā)送JSON數(shù)據(jù)時(shí)
- (void)postJSON
{
// 網(wǎng)絡(luò)請(qǐng)求manager
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 常見(jiàn)錯(cuò)誤三 : 修改AFN支持接收的文本類型 : text/plian
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/plain", nil];
// 常見(jiàn)錯(cuò)誤二 : 修改AFN默認(rèn)的返回的數(shù)據(jù)類型,設(shè)置默認(rèn)為只返回原始的二進(jìn)制數(shù)據(jù),程序猿自己解析
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 常見(jiàn)錯(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);
}];
}