D27:第三方庫ASI, AFNetworking, MKNetworkingKit

目錄

一. 用第三方庫實現get請求

1. ASI
2. AFNetworking

二. Post請求的實現

1. NSURLConnection
2. ASI
3. AFNetworking

三. 使用MKNetworkingKit實現get和Post

1. get請求
2. Post請求

一. 用第三方庫實現get請求

ASI

  1. ASI是較老的第三方庫, 功能非常強大, 可以實現get/post請求, 實現數據的緩存, 實現斷點續傳功能
  1. 由于ASI不支持ARC, 并且ASI庫的作者已經不再維護這個工程, 所有支持ARC的功能沒有實現, 一般新的項目不推薦使用
  2. ASIHttpRequest: ASI最主要的一個類, 這個類是繼承于NSOperation

AFNetworking

  1. AFNetworking是iOS6之后的網絡請求庫, 能夠實現get/post請求, 可以實現斷點續傳等功能
  2. AFNetworking使用簡單, 支持ARC, 一般新的工程都會使用其進行
1. ASI實現get請求的使用步驟
  1. 導入ASI第三方庫
  1. 設置為-fno-objc-arc

  2. 添加系統庫文件

    1. SystemConfiguration,
    2. CFNetwork,
    3. MobileCoreServices
    4. libz.1.1.3.dylib
  3. 導入頭文件使用

    1. 創建ASIHttpRequest對象
    2. 設置代理, 遵守協議
    3. 發送請求(異步請求)
  4. 代碼

     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://api.chengmi.com/shindex?passdate=20150108&curlng=121.5093155189223&curlat=31.27483773025054"]];
     request. delegate = self;
     [request startAsynchronous];
    
  5. ASIHttpRequest代理方法

     // 下載失敗時調用
     - (void)requestFailed:(ASIHTTPRequest *)request
     {
         NSLog(@"%s", __func__);
     }
     
     // 下載結束后調用
     - (void)requestFinished:(ASIHTTPRequest *)request
     {  
         // request.responseData存儲下載回來的二進制數據
    
         // JSON解析
         id result = [NSJSONSerialization JSONObjectWithData:request.responseData options:NSJSONReadingMutableContainers error:nil];  
    
     …………………………………………………………………………………………
     }
    
  6. 常規流程: 創建數據源和表格視圖, 實現表格視圖代理方法


2. AFNetworking
  1. 導入AFNetworking庫文件
  1. 導入頭文件使用

    1. 創建"AFHTTPRequestOperationManager"類型的對象
    2. 設置返回值的解析方式(二進制)
      manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    3. 發送請求
      第一個參數: 請求的url字符串
      第二個參數: 附加的參數(傳nil)
      第三個參數: 請求成功返回時調用的代碼塊(block)
      第四個參數: 請求失敗時調用的代碼塊
  2. 注意的兩點

  3. block代碼塊的執行是異步的

  4. block里面的變量通常會拷貝, 所以里面使用self指向的視圖控制器對象時, 通常使用弱引用, 否則會有內存泄露

  5. 用AFNetworking實現get請求
    - (void)downloadData
    {
    // 1. 導入AFNetworking庫文件
    // 2. 導入頭文件使用
    // 1) 創建"AFHTTPRequestOperationManager"類型的對象
    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];

         // 2) 設置返回值的解析方式(二進制)
         manager.responseSerializer = [AFHTTPResponseSerializer serializer];
         
         // 3) 發送請求
         /*
          第一個參數: 請求的url字符串
          第二個參數: 附加的參數(傳nil)
          第三個參數: 請求成功返回時調用的代碼塊(block)
          第四個參數: 請求失敗時調用的代碼塊
          */
          
         // 4) 注意的兩點
         // 1. block代碼塊的執行是異步的
         // 2. block里面的變量通常會拷貝, 所以里面使用self指向的視圖控制器對象時, 通常使用弱引用, 否則會有內存泄露
    
          __weak ViewController *weakSelf = self;
         [manager GET:@"http://api.chengmi.com/shindex?passdate=20150108&curlng=121.5093155189223&curlat=31.27483773025054" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
             
             // responseObject 存儲了下載回來的數據
             // JSON解析
             id result = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
             if ([result isKindOfClass:[NSDictionary class]]) {
                 NSDictionary *dict = result;
                 for (NSDictionary *sectionDict in dict[@"sectioninfo"]) {
                     DataModel *model = [[DataModel alloc] init];
                     [model setValuesForKeysWithDictionary:sectionDict];
                     [weakSelf.dataArray addObject:model];
                 }
                 [weakSelf.tableView reloadData];
             }
             
         } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             NSLog(@"error:%@", error);
         }];
     }
    
  6. 常規流程: 創建數據源和表格視圖, 調用下載數據方法, 實現表格視圖代理方法


二. Post請求的實現

post請求: 參數不放在url字符串里面, 而是放在請求體里面, 安全性比較高, 而且傳遞的參數數據量會比較大
post請求不能直接在瀏覽器訪問

1. 使用系統的NSURLConnection完成Post請求
  1. 創建NSURL類型對象
  1. 創建NSMutableURLRequest類型對象, 設置對象的屬性

    1. 設置請求體
    2. 設置請求方式
    3. 設置請求參數的大小
  2. 發送請求

  3. downloadData方法
    - (void)downloadData
    {
    // 1. 創建NSURL類型對象
    NSURL *url = [NSURL URLWithString:@"http://services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet"];
    // 2. 創建NSMutableURLRequest類型對象
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    NSString *param = @"sessionKey=7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D&pageSize=10&rtype=2&pageIndex=0&m=getLiteraturegroupBySpecialty";
    // 轉化為二進制數據
    NSData *paramData = [param dataUsingEncoding:NSUTF8StringEncoding];

         // 1) 設置請求體
         [request setHTTPBody:paramData];
         
         // 2) 設置請求方式
         [request setHTTPMethod:@"post"];
         
         // 3) 設置請求參數的大小
         NSString *lengthStr = [NSString stringWithFormat:@"%ld", paramData.length];
         [request setValue:lengthStr forHTTPHeaderField:@"content-length"];
         
         // 4) 設置類型
         [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
     
         // 3.發送請求
         _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
     }  
    
  4. 創建數據源和表格視圖, 實現NSURLConnection代理方法和表格視圖代理方法


2. 使用第三方庫ASI完成Post請求
  1. 使用ASI進行Post請求
    - (void)downloadData
    {
    // 1. 導入ASI第三方庫
    // 2. 添加編譯屬性-fno-objc-arc
    // 3. 添加系統庫
    // 4. 導入頭文件
    // 1)
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet"]];
    // 2) 設置代理
    request.delegate = self;
    // 3) 請求方式
    request.requestMethod = @"POST";
    // 4)
    [request setPostValue:@"7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D" forKey:@"sessionKey"];
    [request setPostValue:@"10" forKey:@"pageSize"];
    [request setPostValue:@"2" forKey:@"rtype"];
    [request setPostValue:@"0" forKey:@"pageIndex"];
    [request setPostValue:@"getLiteraturegroupBySpecialty" forKey:@"m"];
    // 5) 發送請求(異步請求)
    [request startAsynchronous];
    }

  2. 創建數據源和表格視圖, 實現ASIHttpRequest代理方法和表格視圖代理方法

  3. ASI可以上傳文件或圖片(代碼寫在發送請求之前)

     // 上傳文件
     // 第一個參數: 文件的路徑
     // 第二個參數: key值
     // request setFile:<#(NSString *)#> forKey:<#(NSString *)#>
     
     // 上傳圖片
     // 第一個參數: 文件的路徑
     // 第二個參數: 文件的名字
     // 第三個參數: 文件的類型(image/png)
     // 第四個參數: key
     // request setFile:<#(NSString *)#> withFileName:<#(NSString *)#> andContentType:<#(NSString *)#> forKey:<#(NSString *)#>
    

3. 使用AFNetworking完成Post請求
  1. AFNetworking進行Post請求

     - (void)downloadData
     {
         // 1. 導入AFnetworking庫文件
         // 2. 導入頭文件使用
         
         // 1) 創建AFHTTPRequestOperationManager
         AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];
         
         // 2) 設置返回值為二進制類型
         manager.responseSerializer = [AFHTTPResponseSerializer serializer];
         
         // 3) 請求數據
         /*
          第一個參數: url地址
          第二個參數: Post請求的參數, 放在一個字典中
          第三個參數: 請求成功返回調用的代碼塊
          第四個參數: 請求失敗調用的代碼塊
          */
         
         // 請求參數放到一個字典里面
         NSMutableDictionary *parameterDict = [NSMutableDictionary dictionary];
         [parameterDict setObject:@"7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D" forKey:@"sessionKey"];
         [parameterDict setObject:@"10" forKey:@"pageSize"];
         [parameterDict setObject:@"2" forKey:@"rtype"];
         [parameterDict setObject:@"0" forKey:@"pageIndex"];
         [parameterDict setObject:@"getLiteraturegroupBySpecialty" forKey:@"m"];
         
         // 4) 注意的兩點
         // 1. block代碼塊的執行是異步的
         // 2. block里面的變量通常會拷貝, 所以里面使用self指向的視圖控制器對象時, 通常使用弱引用, 否則會有內存泄露
         __weak ViewController *weakSelf = self;
         [manager POST:@"http://services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet" parameters:parameterDict success:^(AFHTTPRequestOperation *operation, id responseObject) {
             
             // JSON數據
             id result = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
             
             if ([result isKindOfClass:[NSDictionary class]]) {
                 NSDictionary *dict = result;
                 NSLog(@"%@", dict);
                 
                 for (NSDictionary *objDict in dict[@"obj"]) {
                     DataModel *model = [[DataModel alloc] init];
                     [model setValuesForKeysWithDictionary:objDict];
                     [weakSelf.dataArray addObject:model];
                 }
                 [weakSelf.tableView reloadData];
             }
     
         } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             
             NSLog(@"error:%@", error);
             
         }];
     }
    
  2. 創建數據源和表格視圖, 實現表格視圖代理方法

  3. AFNetworking可以上傳文件或圖片

     manager POST:(NSString *) parameters:(id) constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
         
         // 上傳文件的時候會使用
         // formData appendPartWithFileURL:<#(NSURL *)#> name:<#(NSString *)#> error:<#(NSError *__autoreleasing *)#>
         
         // 上傳圖片
         // 第四個參數:@"image/png"
         // formData appendPartWithFileData:<#(NSData *)#> name:<#(NSString *)#> fileName:<#(NSString *)#> mimeType:<#(NSString *)#>
         
     } success:<#^(AFHTTPRequestOperation *operation, id responseObject)success#> failure:<#^(AFHTTPRequestOperation *operation, NSError *error)failure#>
    

三. 使用MKNetworkingKit實現get和Post

1. get請求
  1. 下載數據方法
    - (void)downloadData
    {
    // 1. MKNetworkKit文件夾拖入項目,然后引入4個framework:
    // CFNetwork.framework , SystemConfiguration.framework , Security.framework, ImageIO.framework

         // 2. 注意主機名HostName不能加"http://", 程序會自動添加, 主機要指向一個目錄, 不可以是一個具體文件, 如上類不可以是"www.***.net/json/conn.asp"
         
         MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"iappfree.candou.com:8080" customHeaderFields:nil];
         MKNetworkOperation *operation = [engine operationWithPath:@"/free/applications/limited?currency=rmb&page=1" params:nil httpMethod:@"GET" ssl:NO];
         
         [operation addCompletionHandler:^(MKNetworkOperation *operation) {
             
             id result = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableContainers error:nil];
             if ([result isKindOfClass:[NSDictionary class]]) {
                 NSDictionary *dict = result;
                 for (NSDictionary *appDict in dict[@"applications"]) {
                     DataModel *model = [[DataModel alloc] init];
                     [model setValuesForKeysWithDictionary:appDict];
                     [self.dataArray addObject:model];
                 }
                 [self.tableView reloadData];
             }
             
         } errorHandler:^(MKNetworkOperation *errorOp, NSError* err) {
             NSLog(@"MKNetwork request error : %@", [err localizedDescription]);
         }];
         
         [engine enqueueOperation:operation];
     }  
    
  2. 創建數據源和表格視圖, 實現表格視圖代理方法


2. Post請求
  1. 下載數據方法
    - (void)downloadData
    {
    // 1. MKNetworkKit文件夾拖入項目,然后引入4個framework:
    // CFNetwork.Framework , SystemConfiguration.framework , Security.framework

         // 2. 注意主機名HostName不能加"http://", 程序會自動添加, 主機要指向一個目錄, 不可以是一個具體文件, 如上類不可以是"www.***.net/json/conn.asp"
         
         MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"services.xingshulin.com/ApricotForestWirelessServiceForLiterature/LiteratureDataServlet" customHeaderFields:nil];
         
         NSMutableDictionary *paramsDict = [NSMutableDictionary dictionary];
         [paramsDict setObject:@"7B63373363386530373034366164393262633633373039326138356238366366307D2C7B336464363563386338626263653130663531623832616632343963363832323065363964656161627D2C7B66616C73657D2C7B307D2C7B307D2C7B66373539333863642D326162352D346232342D616336622D3132386538626434663366397D2C7B37363033396665333533326461623034656561353162363734643131636532617D2C7B323031352D30332D30372031313A31383A33337D2C7B312E382E367D2C7B696F736C6974657261747572657D2C7B494F536C6974657261747572655F312E382E365F696F73382E312E335F6950686F6E65352D327D" forKey:@"sessionKey"];
         [paramsDict setObject:@"10" forKey:@"pageSize"];
         [paramsDict setObject:@"2" forKey:@"rtype"];
         [paramsDict setObject:@"0" forKey:@"pageIndex"];
         [paramsDict setObject:@"getLiteraturegroupBySpecialty" forKey:@"m"];
         
         MKNetworkOperation *operation = [engine operationWithPath:nil params:paramsDict httpMethod:@"POST"];
         
         [operation addCompletionHandler:^(MKNetworkOperation *operation) {
             
             id result = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableContainers error:nil];
             
             if ([result isKindOfClass:[NSDictionary class]]) {
                 NSDictionary *dict = result;
                 NSLog(@"%@", dict);
                 
                 for (NSDictionary *objDict in dict[@"obj"]) {
                     DataModel *model = [[DataModel alloc] init];
                     [model setValuesForKeysWithDictionary:objDict];
                     [_dataArray addObject:model];
                 }
                 [_tableView reloadData];
             }
             
         } errorHandler:^(MKNetworkOperation *errorOp, NSError* err) {
             NSLog(@"MKNetwork request error : %@", [err localizedDescription]);
         }];
         
         [engine enqueueOperation:operation];
     }
    
  2. 創建數據源和表格視圖, 實現表格視圖代理方法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容