iOS開發之URLSession

1、概述瀏覽器

n  NSURLSession是iOS7中新的網絡接口,與NSURLConnection是並列的。緩存

n  當程序在前臺時,NSURLSession與NSURLConnection大部分能夠互相替代安全

n  NSURLSession支持後臺網絡操做,除非用戶強行關閉服務器

n  NSURLSession提供的功能:cookie

p 經過URL將數據下載到內存網絡

p 經過URL將數據下載到文件系統session

p 將數據上傳到指定URL異步

p 在後臺完成上述功能性能

p 對於小型數據,例如用戶登陸、下載小圖像、JSON & XML仍然使用NSURLConnection的異步或同步方法便可測試

2NSURLSession的使用

n  使用NSURLSessionConfiguration來配置NSURLSession對象

n  用NSURLSession對象來啓動一個NSURLSessionTask對象

n  也可使用系統全局的sharedSession單例來知足大多數的需求

n  注:相比較NSURLConnection的返回處理,NSURLSession提供了靈活的數據返回方式,可使用簡單的block方式來處理返回數據,也可使用更強大的delegate

3NSURLSessionConfiguration

n  做用:用於定義和配置NSURLSession對象

n  每個NSURLSession對象均可以設置不一樣的NSURLSessionConfiguration,從而知足應用內不一樣類型的網絡請求

n  NSURLSessionConfiguration的三種類型:

(1) defaultSessionConfiguration默認session配置,相似NSURLConnection的標準配置,使用硬盤來存儲緩存數據

(2) ephemeralSessionConfiguration臨時session配置,與默認配置相比,這個配置不會將緩存、cookie等存在本地,只會存在內存裏,因此當程序退出時,全部的數據都會消失

(3) backgroundSessionConfiguration後臺session配置,與默認配置相似,不一樣的是會在後臺開啓另外一個線程來處理網絡數據

4NSURLSessionTask

n  NSURLSession使用NSURLSessionTask來具體執行網絡請求的任務

n  NSURLSessionTask支持網絡請求的取消、暫停和恢復,好比下載文件暫停以後再恢復就可以自動從上次的進度繼續下載

n  NSURLSessionTask還能獲取數據的讀取進度

n  NSURLSessionTask的三種類型:

(1) NSURLSessionDataTask 處理通常的NSData數據對象,好比經過GET或POST方式從服務器獲取JSON或XML返回等等,但不支持後臺獲取

(2) NSURLSessionUploadTask 用於上傳文件,支持後臺上傳

(3) NSURLSessionDownloadTask 用於下載文件,支持後臺下載

例如:

#pragma mark - 用Session上傳頭像

- (void)uploadFile

{

    // 1. NSURL

    NSString *urlString = @"http://localhost/uploads/測試一下.png";

    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:urlString];

//    NSURL *url = [NSURL URLWithString:@"http://localhost/uploads/測試一下.png"];

   

    // 2. Request

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:2.0];

   

    request.HTTPMethod = @"PUT";

   

    // 設置用戶受權

    // 1> "admin:123456"

    NSString *authStr = @"admin:123456";

    // 2> result = 對字符串進行BASE64編碼(網絡傳輸中經常使用的一種編碼格式,NSData)

    NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];

    NSString *result = [authData base64EncodedStringWithOptions:0];

    // 3> "Basic result" => 提交給服務器的驗證字符串,用來驗證身份

    NSString *authString = [NSString stringWithFormat:@"Basic %@", result];

   

    // 設置HTTP請求頭的數值,設置用戶受權

    [request setValue:authString forHTTPHeaderField:@"Authorization"];

   

    // 3. Session,有一個單例,是全局共享的

    NSURLSession *session = [NSURLSession sharedSession];

   

    // 4. 文件上傳

    NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"頭像1.png" withExtension:nil];

    // 全部任務默認都是掛起的

    NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromFile:bundleURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

       

        // 上傳完成操做

        NSLog(@"%@", response);

    }];

   

    [task resume];

}

5經過HTTP PUT方法實現文件上傳的步驟

n  實例化NSMutableURLRequest並指定HTTPMethod爲PUT

n  設置請求的受權

(1) 受權字符串格式:用戶名:口令

(2) 受權模式:Basic base64編碼的受權字符串

(3) 爲HTTPHeaderField的Authorization賦值

6文件上傳的請求部分

// 1. URLRequest

NSURL *url = [NSURL URLWithString:@"http://localhost/uploads/xxx.png"];

NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:2.0f];

requestM.HTTPMethod = @"PUT";

// 設置用戶受權

// 1> 受權字符串(用戶名+密碼)

NSString *authStr = @"admin:123456";

// 2> BASE 64編碼

NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];

NSString *base64Str = [authData base64EncodedStringWithOptions:0];

NSString *auth = [NSString stringWithFormat:@"BASIC %@", base64Str];

[requestM setValue:auth forHTTPHeaderField:@"Authorization"];

75HTTP的常見方法

GET         獲取指定資源

POST      2M 向指定資源提交數據進行處理請求,在RESTful風格中用於新增資源

HEAD            獲取指定資源頭部信息

PUT        替換指定資源(不支持瀏覽器操做)

DELETE         刪除指定資源

n  OPTIONS     容許客戶端查看服務器的性能

n  TRACE           回顯服務器收到的請求,主要用於測試或診斷

n  CONNECT    預留給可以將鏈接改成管道方式的代理服務器(HTTP代理使用)

n  提示:

  1. 鑑於安全方面的考慮,服務器大多不會開放全部的HTTP請求方法
  2. PUT和DELETE目前在國內使用很少,大多由POST取代,可是在iOS開發中PUT是最簡單的實現文件上傳的方式
相關文章
相關標籤/搜索