国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

IOS網絡請求之NSURLSession使用

2019-11-09 16:32:18
字體:
來源:轉載
供稿:網友

IOS網絡請求之NSURLsession使用

前言:

    無論是Android還是ios都離不開與服務器交互,這就必須用到網絡請求,記得在2013年做iOS的時候那時候用的ASIHTTPRequest框架,現在重新撿起iOS的時候ASIHTTPRequest已經停止維護,大家都在用AFNetWorking作為首選網絡請求框架,之前的ASIHTTPRequest是基于NSURLConnection類實現的,早期的AFNetWorking也是基于NSURLConnection實現,后來iOS9 之后已經放棄了NSURLConnection,開始使用iOS 7之后推出的NSURLSession,本著追根溯源的原則,首先學習一下NSURLSession的實現網絡請求,然后再去學習AFNetWorking。

 了解NSURLSession

    NSURLSession是2013年iOS 7發布的用于替代NSURLConnection的,iOS 9之后NSURLConnection徹底推出歷史舞臺。其使用起來非常方便,今天使用NSURLConnection分別實現了get、post、表單提交、文件上傳、文件下載,讓我這個以Android開發為主的屌絲程序員贊嘆不已,根據NSURLSession會話對象創建一個請求Task,然后執行該Task即可,包括緩存、會話周期,多線程任務iOS都已經在sdk層面封裝完畢,不過比較遺憾的時NSURLSession只提供了異步請求方式而沒有提供同步請求方式。接下來我們來如何實現網絡請求。

NSURLSession使用

  我們首先以一個簡單的get請求為例開始。

1.)首先構造一個NSURL請求資源地址

   // 構造URL資源地址   NSURL *url = [NSURL URLWithString:@"http://api.nohttp.net/method?name=yanzhenjie&pwd=123"];

2.)創建一個NSRequest請求對象

    // 創建Request請求    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    // 配置Request請求    // 設置請求方法    [request setHTTPMethod:@"GET"];    // 設置請求超時 默認超時時間60s    [request setTimeoutInterval:10.0];    // 設置頭部參數    [request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];    //或者下面這種方式 添加所有請求頭信息    request.allHTTPHeaderFields=@{@"Content-Encoding":@"gzip"};    //設置緩存策略    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

根據需求添加不用的設置,比如請求方式、超時時間、請求頭信息,這里重點介紹下緩存策略:

NSURLRequestUseProtocolCachePolicy = 0 //默認的緩存策略, 如果緩存不存在,直接從服務端獲取。如果緩存存在,會根據response中的Cache-Control字段判斷下一步操作,如: Cache-Control字段為must-revalidata, 則詢問服務端該數據是否有更新,無更新的話直接返回給用戶緩存數據,若已更新,則請求服務端.NSURLRequestReloadIgnoringLocalCacheData = 1 //忽略本地緩存數據,直接請求服務端.NSURLRequestIgnoringLocalAndRemoteCacheData = 4 //忽略本地緩存,代理服務器以及其他中介,直接請求源服務端.NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheDataNSURLRequestReturnCacheDataElseLoad = 2 //有緩存就使用,不管其有效性(即忽略Cache-Control字段), 無則請求服務端. NSURLRequestReturnCacheDataDontLoad = 3 //只加載本地緩存. 沒有就失敗. (確定當前無網絡時使用)NSURLRequestReloadRevalidatingCacheData = 5 //緩存數據必須得得到服務端確認有效才使用

3.)創建NSURLSession會話對象

可以通過采用iOS共享Session的方式

    // 采用蘋果提供的共享session    NSURLSession *sharedSession = [NSURLSession sharedSession];

可以通過NSURLSessionConfiguration方式配置不同的NSURLSession

    // 構造NSURLSessionConfiguration    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];    // 構造NSURLSession,網絡會話;    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];

通過NSURLSessionConfiguration提供了三種創建NSURLSession的方式

defaultSessionConfiguration //默認配置使用的是持久化的硬盤緩存,存儲證書到用戶鑰匙鏈。存儲cookie到shareCookie。ephemeralSessionConfiguration //不使用永久持存cookie、證書、緩存的配置,最佳優化數據傳輸。backgroundSessionConfigurationWithIdentifier //可以上傳下載HTTP和HTTPS的后臺任務(程序在后臺運行)。

在后臺時,將網絡傳輸交給系統的單獨的一個進程,即使app掛起、推出甚至崩潰照樣在后臺執行。

也可以通過NSURLSessionConfiguration統一設置超時時間、請求頭等信息

    // 構造NSURLSessionConfiguration    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];    //設置請求超時為10秒鐘    configuration.timeoutIntervalForRequest = 10;        //在蜂窩網絡情況下是否繼續請求(上傳或下載)    configuration.allowsCellularaccess = NO;    //配置請求頭    configuration.HTTPAdditionalHeaders =@{@"Content-Encoding":@"gzip"};

4.) 創建NSURLSessionTask對象,然后執行

    // 構造NSURLSessionTask,會話任務;    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {        // 請求失敗,打印錯誤信息        if (error) {            NSLog(@"get error :%@",error.localizedDescription);        }        //請求成功,解析數據        else {            // JSON數據格式解析            id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];            // 判斷是否解析成功            if (error) {                NSLog(@"get error :%@",error.localizedDescription);            }else {                NSLog(@"get success :%@",object);                // 解析成功,處理數據,通過GCD獲取主隊列,在主線程中刷新界面。                dispatch_async(dispatch_get_main_queue(), ^{                    // 刷新界面....                });            }        }    }];

iOS為了適應不同的應用場景提供了不同類型的NSSessionTask

NSURLSessionDataTask  //一般的get、post等請求NSURLSessionUploadTask // 用于上傳文件或者數據量比較大的請求NSURLSessionDownloadTask //用于下載文件或者數據量比較大的請求NSURLSessionStreamTask //建立一個TCP / IP連接的主機名和端口或一個網絡服務對象。

task的三個函數

- (void)suspend;//暫停- (void)resume;//開始或者恢復 - (void)cancel;//關閉任務

NSURLSession其他請求示例

 1.)post請求

    // 1、創建URL資源地址    NSURL *url = [NSURL URLWithString:@"http://api.nohttp.net/postBody"];    // 2、創建Reuest請求    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    // 3、配置Request    // 設置請求超時    [request setTimeoutInterval:10.0];    // 設置請求方法    [request setHTTPMethod:@"POST"];    // 設置頭部參數    [request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];    // 4、構造請求參數    // 4.1、創建字典參數,將參數放入字典中,可防止程序員在主觀意識上犯錯誤,即參數寫錯。    NSDictionary *parametersDict = @{@"name":@"yanzhenjie",@"pwd":@"123"};    // 4.2、遍歷字典,以“key=value&”的方式創建參數字符串。    NSMutableString *parameterString = [[NSMutableString alloc]init];    int pos =0;    for (NSString *key in parametersDict.allKeys) {        // 拼接字符串        [parameterString appendFormat:@"%@=%@", key, parametersDict[key]];        if(pos<parametersDict.allKeys.count-1){            [parameterString appendString:@"&"];        }        pos++;    }    // 4.3、NSString轉成NSData數據類型。    NSData *parametersData = [parameterString dataUsingEncoding:NSUTF8StringEncoding];    // 5、設置請求報文    [request setHTTPBody:parametersData];    // 6、構造NSURLSessionConfiguration    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];    // 7、創建網絡會話    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];    // 8、創建會話任務    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {        // 10、判斷是否請求成功        if (error) {            NSLog(@"post error :%@",error.localizedDescription);        }else {            // 如果請求成功,則解析數據。            id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];            // 11、判斷是否解析成功            if (error) {                NSLog(@"post error :%@",error.localizedDescription);            }else {                // 解析成功,處理數據,通過GCD獲取主隊列,在主線程中刷新界面。                NSLog(@"post success :%@",object);                dispatch_async(dispatch_get_main_queue(), ^{                    // 刷新界面...                });            }        }            }];    // 9、執行任務    [task resume];

2.)附帶表單參數文件上傳

    NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];    NSTimeInterval a=[dat timeIntervalSince1970];    NSString* fileName = [NSString stringWithFormat:@"file_%0.f.txt", a];        [FileUtils writeDataToFile:fileName data:[@"upload_file_to_server" dataUsingEncoding:NSUTF8StringEncoding]];        // 以流的方式上傳,大小理論上不受限制,但應注意時間    // 1、創建URL資源地址    NSURL *url = [NSURL URLWithString:@"http://api.nohttp.net/upload"];    // 2、創建Reuest請求    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    // 3、配置Request    //設置Body值方法二,這種方法比較原始,不常用,不過可以用來上傳參數和文件    NSString *BOUNDARY = @"whoislcj";//表單分界線 可以自定義任意值    [request setValue:[@"multipart/form-data; boundary=" stringByAppendingString:BOUNDARY] forHTTPHeaderField:@"Content-Type"];    // 文件上傳使用post    [request setHTTPMethod:@"POST"];    // 設置請求超時    [request setTimeoutInterval:30.0f];    //用于存放二進制數據流    NSMutableData *body = [NSMutableData data];        //追加一個普通表單參數 name=yanzhenjie    NSString *nameParam = [NSString stringWithFormat:@"--%@/r/nContent-Disposition: form-data; name=/"%@/"/r/n/r/n%@/r/n",BOUNDARY,@"name",@"yanzhenjie",nil];    [body appendData:[nameParam dataUsingEncoding:NSUTF8StringEncoding]];        //追加一個普通表單參數 pwd=123    NSString *pwdParam = [NSString stringWithFormat:@"--%@/r/nContent-Disposition: form-data; name=/"%@/"/r/n/r/n%@/r/n",BOUNDARY,@"pwd",@"123",nil];    [body appendData:[pwdParam dataUsingEncoding:NSUTF8StringEncoding]];        //追加一個文件表單參數    // Content-Disposition: form-data; name="<服務器端需要知道的名字>"; filename="<服務器端這個傳上來的文件名>"    // Content-Type: application/octet-stream --根據不同的文件類型選擇不同的值    NSString *file = [NSString stringWithFormat:@"--%@/r/nContent-Disposition: form-data; name=/"%@/";filename=/"%@/"/r/nContent-Type: application/octet-stream/r/n/r/n",BOUNDARY,@"headUrl",fileName,nil];    [body appendData:[file dataUsingEncoding:NSUTF8StringEncoding]];    //獲取file路徑    NSString *filePath =[FileUtils getFilePath:fileName];    NSData *data =[NSData dataWithContentsOfFile:filePath];    //追加文件二進制數據    [body appendData:data];    [body appendData:[@"/r/n" dataUsingEncoding:NSUTF8StringEncoding]];    //結束分割線    NSString *endString = [NSString stringWithFormat:@"--%@--",BOUNDARY];    [body appendData:[endString dataUsingEncoding:NSUTF8StringEncoding]];        // 創建會話    NSURLSession *session = [NSURLSession sharedSession];    // 3.開始上傳   request的body data將被忽略,而由fromData提供    NSURLSessionUploadTask *uploadTask= [session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {        if (error) {            NSLog(@"upload error:%@",error);        } else {            NSLog(@"upload success:%@", [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error]);            dispatch_async(dispatch_get_main_queue(), ^{                // 刷新界面...            });        }    }];    //執行任務    [uploadTask resume];

3.)文件下載

    // 創建url    NSString *urlStr =@"http://images2015.cnblogs.com/blog/950883/201701/950883-20170105104233581-62069155.png";    NSURL *Url = [NSURL URLWithString:urlStr];    // 創建請求    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:Url];    // 設置請求超時    [request setTimeoutInterval:30.0];    // 創建會話    NSURLSession *session = [NSURLSession sharedSession];        NSURLSessionDownloadTask *downLoadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {        if (!error) {            NSLog(@"download sucess : %@", location);            NSData *data=[NSData dataWithContentsOfURL:location];            UIImage *image=[UIImage imageWithData:data];            dispatch_async(dispatch_get_main_queue(), ^{                // 刷新界面...                UIImageView *imageView =[[UIImageView alloc]init];                imageView.image=image;                [self.view addSubview:imageView];                [imageView mas_makeConstraints:^(MASConstraintMaker *make) {                    make.center.equalTo(self.view);                    make.size.mas_equalTo(CGSizeMake(300, 300));                }];            });        } else {            NSLog(@"download error : %@", error.localizedDescription);        }    }];    //啟動任務    [downLoadTask resume];

總結:

  今天學習了iOS底層如何實現網絡請求的,為了開發效率還得依靠優秀的第三方開源框架,接下來抽時間學習一下受廣大iOS開發者親賴的網絡開源框架AFNetWorking。

干我們這行,啥時候懈怠,就意味著長進的停止,長進的停止就意味著被淘汰,只能往前沖,直到鳳凰涅槃的一天!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兴隆县| 镇沅| 汝城县| 兴仁县| 迁西县| 威信县| 宁都县| 乌兰浩特市| 桃园市| 江津市| 大英县| 安化县| 九江县| 海盐县| 樟树市| 洪湖市| 六安市| 招远市| 师宗县| 南宁市| 阿克苏市| 辉南县| 涿鹿县| 贵港市| 花莲县| 大兴区| 开阳县| 黄骅市| 珠海市| 屏南县| 远安县| 拜城县| 黄陵县| 苍山县| 临安市| 铁岭县| 仪征市| 济阳县| 渭南市| 泰安市| 涞源县|