AFN詳解

//
// MJViewController.m
// 03.AFN演練
//
// Created by apple on 14-4-30.
// Copyright (c) 2014年 itcast. All rights reserved.
//

import "MJViewController.h"

import "AFNetworking.h"

@interface MJViewController ()

@end

@implementation MJViewController
/**
要使用常規(guī)的AFN網(wǎng)絡(luò)訪問

  1. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    所有的網(wǎng)絡(luò)請(qǐng)求,均有manager發(fā)起

  2. 需要注意的是,默認(rèn)提交請(qǐng)求的數(shù)據(jù)是二進(jìn)制的,返回格式是JSON

    1> 如果提交數(shù)據(jù)是JSON的,需要將請(qǐng)求格式設(shè)置為AFJSONRequestSerializer
    2> 如果返回格式不是JSON的,

  3. 請(qǐng)求格式

    AFHTTPRequestSerializer 二進(jìn)制格式
    AFJSONRequestSerializer JSON
    AFPropertyListRequestSerializer PList(是一種特殊的XML,解析起來相對(duì)容易)

  4. 返回格式

    AFHTTPResponseSerializer 二進(jìn)制格式
    AFJSONResponseSerializer JSON
    AFXMLParserResponseSerializer XML,只能返回XMLParser,還需要自己通過代理方法解析
    AFXMLDocumentResponseSerializer (Mac OS X)
    AFPropertyListResponseSerializer PList
    AFImageResponseSerializer Image
    AFCompoundResponseSerializer 組合
    */

  • (void)viewDidLoad
    {
    [super viewDidLoad];

    [self reach];
    }

pragma mark - 演練

pragma mark - 檢測(cè)網(wǎng)絡(luò)連接

  • (void)reach
    {
    /**
    AFNetworkReachabilityStatusUnknown = -1, // 未知
    AFNetworkReachabilityStatusNotReachable = 0, // 無連接
    AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花錢
    AFNetworkReachabilityStatusReachableViaWiFi = 2, // 局域網(wǎng)絡(luò),不花錢
    */
    // 如果要檢測(cè)網(wǎng)絡(luò)狀態(tài)的變化,必須用檢測(cè)管理器的單例的startMonitoring
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];

    // 檢測(cè)網(wǎng)絡(luò)連接的單例,網(wǎng)絡(luò)變化時(shí)的回調(diào)方法
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(@"%d", status);
    }];
    }

pragma mark - Session 下載

  • (void)sessionDownload
    {
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:config];

    NSString *urlString = @"http://localhost/itcast/videos/01.C語言-語法預(yù)覽.mp4";
    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    // 指定下載文件保存的路徑
    // NSLog(@"%@ %@", targetPath, response.suggestedFilename);
    // 將下載文件保存在緩存路徑中
    NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    NSString *path = [cacheDir stringByAppendingPathComponent:response.suggestedFilename];

      // URLWithString返回的是網(wǎng)絡(luò)的URL,如果使用本地URL,需要注意  
      NSURL *fileURL1 = [NSURL URLWithString:path];  
      NSURL *fileURL = [NSURL fileURLWithPath:path];  
        
      NSLog(@"== %@ |||| %@", fileURL1, fileURL);  
        
      return fileURL;  
    

    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog(@"%@ %@", filePath, error);
    }];

    [task resume];
    }

pragma mark - POST JSON

  • (void)postJSON
    {
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    NSDictionary *dict = @{@"name": @"zhangsan"};
    NSDictionary *dict1 = @{@"name": @"wangwu"};
    NSArray *array = @[dict, dict1];
    // 設(shè)置請(qǐng)求格式
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    // 設(shè)置返回格式
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    [manager POST:@"http://localhost/postjson.php" parameters:array success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

      NSLog(@"%@", result);  
    

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    }];

}

pragma mark - 隨機(jī)文件名上傳

  • (void)postUpload1
    {
    // 本地上傳給服務(wù)器時(shí),沒有確定的URL,不好用MD5的方式處理
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    [manager POST:@"http://localhost/demo/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

      NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"頭像1.png" withExtension:nil];  
        
      // 要上傳保存在服務(wù)器中的名稱  
      // 使用時(shí)間來作為文件名 2014-04-30 14:20:57.png  
      // 讓不同的用戶信息,保存在不同目錄中  
      NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
      // 設(shè)置日期格式  
      formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";  
      NSString *fileName = [formatter stringFromDate:[NSDate date]];  
        
      [formData appendPartWithFileURL:fileURL name:@"uploadFile" fileName:fileName mimeType:@"image/png" error:NULL];  
    

    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"OK");
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"error");
    }];
    }

pragma mark - POST上傳

  • (void)postUpload
    {
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    // AFHTTPResponseSerializer就是正常的HTTP請(qǐng)求響應(yīng)結(jié)果:NSData
    // 當(dāng)請(qǐng)求的返回?cái)?shù)據(jù)不是JSON,XML,PList,UIImage之外,使用AFHTTPResponseSerializer
    // 例如返回一個(gè)html,text...
    //
    // 實(shí)際上就是AFN沒有對(duì)響應(yīng)數(shù)據(jù)做任何處理的情況
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    // formData是遵守了AFMultipartFormData的對(duì)象
    [manager POST:@"http://localhost/demo/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

      // 將本地的文件上傳至服務(wù)器  
      NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"頭像1.png" withExtension:nil];  
        
      [formData appendPartWithFileURL:fileURL name:@"uploadFile" error:NULL];  
    

    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

      NSLog(@"完成 %@", result);  
    

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"錯(cuò)誤 %@", error.localizedDescription);
    }];
    }

pragma mark - JSON

  • (void)XMLData
    {
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    // 返回的數(shù)據(jù)格式是XML
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];

    NSDictionary *dict = @{@"format": @"xml"};

    // 網(wǎng)絡(luò)訪問是異步的,回調(diào)是主線程的,因此程序員不用管在主線程更新UI的事情
    [manager GET:@"http://localhost/videos.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {

      // 如果結(jié)果是XML,同樣需要使用6個(gè)代理方法解析,或者使用第三方庫  
      // 第三方庫第三方框架,效率低,內(nèi)存泄漏  
      NSLog(@"%@", responseObject);  
    

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
    }];
    }

pragma mark - JSON

  • (void)JSONData
    {
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    // 原本需要拼接get訪問URL ? & =
    NSDictionary *dict = @{@"format": @"json"};

    // 網(wǎng)絡(luò)訪問是異步的,回調(diào)是主線程的,因此程序員不用管在主線程更新UI的事情
    [manager GET:@"http://localhost/videos.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"%@", responseObject);
    // 提問:NSURLConnection異步方法回調(diào),是在子線程
    // 得到回調(diào)之后,通常更新UI,是在主線程
    NSLog(@"%@", [NSThread currentThread]);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
    }];
    }

pragma mark - POST登錄

  • (void)postLogin
    {
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    // 原本需要拼接get訪問URL ? & =
    NSDictionary *dict = @{@"username": @"wangwu", @"password" : @"wang"};

    // 網(wǎng)絡(luò)訪問是異步的,回調(diào)是主線程的,因此程序員不用管在主線程更新UI的事情
    [manager POST:@"http://localhost/login.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"%@", responseObject);
    // 提問:NSURLConnection異步方法回調(diào),是在子線程
    // 得到回調(diào)之后,通常更新UI,是在主線程
    NSLog(@"%@", [NSThread currentThread]);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
    }];
    }

pragma mark - GET登錄

  • (void)getLogin
    {
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    // 原本需要拼接get訪問URL ? & =
    NSDictionary *dict = @{@"username": @"wangwu", @"password" : @"wang"};

    // 網(wǎng)絡(luò)訪問是異步的,回調(diào)是主線程的,因此程序員不用管在主線程更新UI的事情
    [manager GET:@"http://localhost/login.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"%@", responseObject);
    // 提問:NSURLConnection異步方法回調(diào),是在子線程
    // 得到回調(diào)之后,通常更新UI,是在主線程
    NSLog(@"%@", [NSThread currentThread]);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
    }];
    }

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谐腰,一起剝皮案震驚了整個(gè)濱河市孕豹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怔蚌,老刑警劉巖巩步,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異桦踊,居然都是意外死亡椅野,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門籍胯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竟闪,“玉大人,你說我怎么就攤上這事杖狼×陡颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蝶涩,是天一觀的道長(zhǎng)理朋。 經(jīng)常有香客問我,道長(zhǎng)绿聘,這世上最難降的妖魔是什么嗽上? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮熄攘,結(jié)果婚禮上兽愤,老公的妹妹穿的比我還像新娘。我一直安慰自己挪圾,他們只是感情好浅萧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哲思,像睡著了一般洼畅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棚赔,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天土思,我揣著相機(jī)與錄音,去河邊找鬼忆嗜。 笑死己儒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捆毫。 我是一名探鬼主播闪湾,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绩卤!你這毒婦竟也來了途样?” 一聲冷哼從身側(cè)響起江醇,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎何暇,沒想到半個(gè)月后陶夜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裆站,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年条辟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏胯。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羽嫡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肩袍,到底是詐尸還是另有隱情杭棵,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布氛赐,位于F島的核電站魂爪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏艰管。R本人自食惡果不足惜滓侍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛙婴。 院中可真熱鬧,春花似錦尔破、人聲如沸街图。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽餐济。三九已至,卻和暖如春胆剧,著一層夾襖步出監(jiān)牢的瞬間絮姆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工秩霍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留篙悯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓铃绒,卻偏偏與公主長(zhǎng)得像鸽照,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颠悬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容