iOS的基礎網路程式設計

樹上的猿發表於2016-04-27

如有錯誤請指出


首先在進行網路程式設計時我們要對HTTP協議有一定的瞭解。HTTP協議,全稱“超文字傳輸協議”,瀏覽器和伺服器之間的通訊規則,HTTP協議永遠都是客戶端發起請求,伺服器回送響應。客戶端傳送一個請求,是向伺服器提交一個請求包,伺服器收到請求後,會向客戶端回應一個響應包。HTTP的請求包由兩部分組成:請求頭和請求體。同理響應包也有響應頭和響應體。伺服器是通過響應包將資料傳送給客戶端,資料主要在響應包得響應體中,響應頭中有相應的資料的型別以及狀態碼。HTTP常見的請求方式有兩種,一種是GET請求,是向伺服器索取資料的一種請求方式,只有請求頭,另外一種是POST請求,是向伺服器提交資料的一種方式請求方式,有請求頭和請求體。



講完了HTTP的相關知識,現在給大家講一下接下來要用到的類。

1.NSURLRequest 用於儲存客戶端傳送給伺服器的資料包資訊和請求設定,因為其基本設定選項較少所以我們一般使用其子類:NSMutableURLRequest。

2.NSURLResponse用於儲存伺服器返回的響應包資料,如果傳送的是HTTP請求,那麼使用其子類:NSHTTPURLResponse

3.NSURLSession指的是一個網路會話(session),一個網路會話可以發起多個任務(Task),一個任務對應了一次網路請求。

Task有三種型別:
(1).NSURLSessionDataTask:資料任務,擅長處理小且頻繁的應用程式之間的請求。
(2).NSURLSessionUploadTask:上傳任務,以檔案的形式傳送資料,可以在 程式沒有執行時進行後臺上傳。
(3).NSURLSessionDownloadTask:下載任務,以檔案的形式接受資料,可以在程式沒有執行時進行後臺下載。
4.NSURLSessionConfiguration用於配置建立Session的型別,總共有三個型別:
(1).deafaultSessionConfiguration用於建立預設型別的Session物件,
(2).ephemeralSessionConfiguration建立臨時型別的Session物件
(3).backgroundSessionConfiguration:(NSString *)identifier用於建立後臺Session物件

網路請求的基本流程:

使用NSURLSession進行網路請求的流程:

     1.構造NSURL

     2.構造NSURLRequest請求物件

     3.構造NSURLSession會話物件

     4.建立網路請求任務:dataTask, downloadTask, uploadTask

     5.傳送網路請求



GET程式碼:

    //請求網址
    NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/cinema/list.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"];
    
    //設定request屬性
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    request.HTTPMethod = @"GET";
    request.timeoutInterval = 60;
    
    //建立session,預設是多執行緒
    NSURLSession *session = [NSURLSession sharedSession];
    
    //設定任務及其回撥的Block
    NSURLSessionDataTask *dataTsk = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@"請求出錯:%@",error);
            
            return;
        }
        
        
        NSError *jsonError = nil;
        
        //獲取響應的資料
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError];
        //列印響應的資料
        NSLog(@"%@",dic);
    
        [_textView performSelectorOnMainThread:@selector(setText:) withObject:[NSString stringWithFormat:@"%@", dic] waitUntilDone:YES];
    }];
    //開始任務
    [dataTsk resume];

POST程式碼:

   

    NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/cinema/list.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"POST";
    //如果60S不響應就退出
    request.timeoutInterval = 60;
    //設定請求體
    NSData *bodyData =[@"cinema_id=1533" dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPBody = bodyData;
    
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        
        NSString *jsonString = [NSString stringWithFormat:@"%@",dic];
       
        //轉換型別
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        //列印狀態碼
        NSLog(@"狀態設計:%li",httpResponse.statusCode);
        //列印響應頭
        NSDictionary *responseHeader = httpResponse.allHeaderFields;
        NSLog(@"響應頭:%@",responseHeader);
    }];
    
    [dataTask resume]


下載任務:

    NSURL *url = [NSURL URLWithString:@"http://dlsw.baidu.com/sw-search-sp/soft/bf/35013/Baidu_Setup_1959_2.2.0.1452_10000010.1449569847.exe"];
    //設定Configs屬性
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    
    //這兒可以使用代理方法檢測下載任務
    session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
    downloadTask = [session downloadTaskWithURL:url];
    
    [downloadTask resume];

上傳任務:

    NSURL *url = [NSURL URLWithString:@"https://api.weibo.com/2/statuses/upload.json"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"POST";
    
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data;charset = utf-8;boundary=%@", Boundary];
    [request setValue:contentType forHTTPHeaderField:@"Content-Type"];
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"upload_pic" ofType:@"jpg"];
    NSData *imageData = [NSData dataWithContentsOfFile:path];
    //自定義的請求體方法
    NSData *boadyData = [self bulidHTTPBodyData:imageData];
    
    NSURLSession *session = [NSURLSession sharedSession];
    
    NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:boadyData completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        NSLog(@"error:%@", error);
        NSLog(@"上傳圖片至微博成功:%@", response);
    }];
    
    [uploadTask resume];


相關文章