04、數據請求

一、HTTP協議的常見請求方式

無論是哪種請求方式都應該在info.plist文件中設置網絡權限


權限設置.png

首先是GET請求
//get請求
-(void)getMethod{
   //創建會話對象,用來建立客戶端和服務端的會話(通信)
    //session一共有三種會話模式:默認,瞬時,后臺
    NSURLSession* session=[NSURLSession sharedSession];
    //網址
    NSURL* url=[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
    //建立任務對象  任務類為NSURLSessionDataTask,他有三個子類:NSURLSessionDataTask(加載任務)、NSURLSessionUpLoadTask(上傳任務)、NSURLSessionDownLoadTask(下載任務),根據不同的需求使用對應的任務對象
    //直接使用url,沒有設置請求方式,默認為get請求
    NSURLSessionDataTask* task=[session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //data:請求返回的數據
        //response:響應對象,里面包含了少量數據和響應頭
        //error:響應出問題時返回的錯誤日志
        
        //根據返回的數據結構進行對應的解析
        if (data) {
            NSDictionary* dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
//            NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
             NSLog(@"%@",dic);
        }else{
            NSLog(@"未請求到數據");
        }
    } ];
    
    //啟動任務
    [task resume];
    
}

下面是第二種GET請求的方式

//第二種get請求
-(void)newGetMethod{
    //創建會話模式對象
    //默認:向后臺請求數據的時候,如果數據沒有發生變化,就從本地緩存進行加載,如果沒有變化,重新從服務器獲取數據,如果本地沒有緩存,直接從服務器獲取
//    NSURLSessionConfiguration* configuration=[NSURLSessionConfiguration defaultSessionConfiguration];
    //瞬時:本地不會做任何緩存,每次請求都是從服務器獲取新數據
    NSURLSessionConfiguration* ephemeralConfiguration=[NSURLSessionConfiguration ephemeralSessionConfiguration];
    //后臺:如果有些網絡請求需要在客戶端后臺進行操作,那么就需要使用該種會話模式,使用時需要加一個標記,方便查找和操作
//     NSURLSessionConfiguration* backgroundConfiguration=[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"background"];
   //創建會話對象  設置一下會話模式
    NSURLSession* session=[NSURLSession sessionWithConfiguration:ephemeralConfiguration];
    //創建網址
      NSURL* url=[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
    //創建請求對象  可變的requset對象可以設置請求方式(默認的請求方式為GET),還可以設置請求體(轉換成data類型的參數)
    NSURLRequest* request=[NSURLRequest requestWithURL:url];
    //創建任務對象
    NSURLSessionDataTask* task=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (data) {
            NSDictionary* dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
//            NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
             NSLog(@"%@",dic);
        }else{
            NSLog(@"未請求到數據");
        }
    }];
    //啟動任務
    [task resume];
  
}

還可以使用協議代理,首先遵循協議
NSURLSessionDelegate,NSURLSessionDataDelegate

-(void)delegate{
    NSURLSession* session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc]init]];
    //創建任務
    NSURLSessionDataTask* task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=5&len=10&udid=1234567890&terminalType=Iphone&cid=213"]]];
    //啟動任務
    [task resume];
}

協議方法

//代理方法
//服務器開始響應 準備返回數據
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
    NSLog(@"服務器開始響應");
    //允許處理服務器的響應,才會繼續接收服務器返回的數據
    completionHandler(NSURLSessionResponseAllow);
    
}
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
    NSLog(@"客戶端接收數據");
    
    NSLog(@"dic---%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    
    
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
    NSLog(@"數據接收完成,網絡請求成功");
}
POST請求
//post請求
-(void)postMethod{
    //session對象
    NSURLSession* session=[NSURLSession sharedSession];
    //網址
    NSURL* url=[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
    //?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213
    //如果我們使用的是post請求方式,就需要用到可變的mRequest對象
    NSMutableURLRequest* mRequest=[NSMutableURLRequest requestWithURL:url];
    //設置請求方式,默認為GET
    mRequest.HTTPMethod=@"POST";
    //設置請求體
    NSString* postStr=@"date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    NSData* postData=[postStr dataUsingEncoding:NSUTF8StringEncoding];
    mRequest.HTTPBody=postData;
    //創建任務對象
    NSURLSessionDataTask* task=[session dataTaskWithRequest:mRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (data) {
            NSDictionary* dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
//            NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
            NSLog(@"%@",dic);
        }else{
            NSLog(@"未請求到數據");
        }
    }];
    //啟動任務
    [task resume];
  
}
兩種請求方式進行比較

不同點:
1.給服務器傳輸數據的方式不同
GET:通過網址字符串
POST:通過Data
2.傳輸數據的大小
GET:網址字符串最多為255字節
POST:使用NSData,容量超過1G
3.安全性
GET:所有傳輸給服務的數據,顯示在網址里,類似于密碼的明文輸入,直接可見
POST:數據被轉成NSData,類似于密碼的密文輸入,無法直接讀取

下載
//下載
-(void)downLoadMethod{
    NSURLSession* session=[NSURLSession sharedSession];
    NSURL* url=[NSURL URLWithString:@"http://e.hiphotos.baidu.com/image/pic/item/7af40ad162d9f2d3433e1c33acec8a136327cc3a.jpg"];
    NSURLSessionDownloadTask* task=[session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //location:下載完成的數據所在的地址,在tmp臨時文件中
        //由于臨時文件夾中的文件一般在下載結束后,如果不使用,就會被干掉,所以我們會將下載好的文件移動到我們指定的位置保存
        // /Users/xalo/Desktop/
         NSString* dsiPath=@"/Users/xalo/Desktop/test.png";
        //將文件路徑轉換為url類型
        NSURL* urlPath=[NSURL fileURLWithPath:dsiPath];
        NSFileManager* manager=[NSFileManager defaultManager];
        //將文件拷貝到指定路徑下
       BOOL isSuccess= [manager copyItemAtURL:location toURL:urlPath error:nil];
        if (isSuccess) {
            NSLog(@"文件下載成功");
        }else{
             NSLog(@"文件下載失敗");
        }
    }];
   //啟動任務
    [task resume];       
}

以上方法都需要在ViewDidLoad中調用即可

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

推薦閱讀更多精彩內容

  • AFHTTPRequestOperationManager 網絡傳輸協議UDP、TCP、Http、Socket、X...
    Carden閱讀 4,377評論 0 12
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,123評論 6 13
  • 常見的請求方式 GET請求 POST請求 不同點: 給服務器傳輸數據的方式不同,GET是通過網址字符串,POST是...
    Joker_King閱讀 5,669評論 0 8
  • 同步請求可以從因特網請求數據, 一旦發送同步請求,程序將停止用戶交互,直至服務器返回數據完成, 才可以進行下一步操...
    小灬博閱讀 894評論 2 4
  • 孕媽媽歷“險”記(五) 時間過得好快,美女于春暖花開時節懷孕,經過夏日炎炎、秋風送爽,談笑間,可就進入冬天了。 今...
    高其武閱讀 628評論 0 2