NSURLSession基本使用

NSURLSession基本使用

NSURLSession是iOS7推出來的用於替代NSURLConnection的一個網絡框架,從iOS9開始系統也已不在推薦使用NSURLConnection,轉而使用NSURLSession進行網絡請求。

NSURLSession使用是之前的NSURLConnection相比較發生了一些。其使用的步驟可以簡單分爲

1.創建session

2.創建task

3.啓動resume

Task類型:

這裏寫圖片描述
NSURLSession 總共有三種類型task

NSURLSessionDataTask
NSURLSessionUploadTask
NSURLSessionDownloadTask

其NSURLSessionDataTask、NSURLSessionDownloadTask繼承自NSURLSessionTask,分別用於請求數據與下載使用,剩下的NSURLSessionUploadTask是繼承自NSURLSessionDataTask,其作用與其名字一樣用於上傳文件。

簡單的Get、Post請求

Get請求示例

-(void)get{

    NSString *urlStr = @"http://apis.baidu.com/apistore/currencyservice/type";

    //創建
    NSURLSession *session  = [NSURLSession sharedSession];

    //創建task
     NSURLSessionDataTask *task =[session dataTaskWithURL:[NSURL URLWithString:urlStr] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        NSLog(@"%@", [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);

    }];

    /**
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlStr]];
    NSURLSessionDataTask *task2 =  [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"22:%@",  [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }];**/

    //啓動
    [task resume];
    //[task suspend];//暫停
    //[task cancel];

}

Post請求示例

-(void)post{

    /**
        假設請求的接口爲這樣
        url = ”http://xx/cmserver/login“
        參數:password
             username
     **/

    //創建
    NSURLSession *session  = [NSURLSession sharedSession];

    //request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://xx/cmserver/login"]];
    request.HTTPMethod = @"post";
    NSData *body = [@"password=123456&username=loukit" dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPBody = body;

    //創建task
    NSURLSessionDataTask *task =  [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"%@",  [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }];

    [task resume];

}   

代理方式Get、Post請求

實現 NSURLSession的代理NSURLSessionDataDelegate

//接收到服務器響應的時候調用
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    NSLog(@"didReceiveResponse");
    /*
     NSURLSessionResponseCancel
     NSURLSessionResponseAllow = 1,
     NSURLSessionResponseBecomeDownload
     NSURLSessionResponseBecomeStream
     */
    //必須調用這句話,不然不會進入下面代理
    completionHandler(NSURLSessionResponseAllow);
}

//接收服務器返回數據 極有可能會被調用多次
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    NSLog(@"didReceiveData");
}

//請求完成之後 如果錯誤error有值 否則nil
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task     didCompleteWithError:(NSError *)error
{
    NSLog(@"didCompleteWithError");
}

Get請求:

-(void)Get{

    NSString *urlStr = @"http://apis.baidu.com/apistore/currencyservice/type";
    //創建config
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    //創建session
    NSURLSession *session  = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    //創建task
    NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:urlStr]];
    //啓動
    [task resume];

}

Post 請求

-(void)Post{
    /**
     假設請求的接口爲這樣
     url = 'http://xx/cmserver/login'
     參數:password
     usernmae
     **/

    //創建config
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

    //創建request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://xx/cmserver/login"]];
    request.HTTPMethod = @"post";
    NSData *body = [@"password=123456&username=loukit" dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPBody = body;

    //創建session
    NSURLSession *session  = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    //創建task
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
    //啓動
    [task resume];
}

NSURLSession https 問題

如果在使用過程中大家的url是https的需要實現代理的一個方法,坐下處理

-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler
    {

    /*
     NSURLSessionAuthChallengeUseCredential = 0,      使用
     NSURLSessionAuthChallengePerformDefaultHandling = 1,   忽略(默認)
     NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2,忽略(會取消請求)
     NSURLSessionAuthChallengeRejectProtectionSpace = 3, 忽略(下次繼續詢問)
     */

    //NSURLAuthenticationMethodServerTrust 服務器信任
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {

        //創建證書
        NSURLCredential *credentoal = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];

        completionHandler(NSURLSessionAuthChallengeUseCredential,credentoal);
    }

}

遺留兩個功能

URLSession 還剩兩個功能(下載、上傳)沒演示,後面有時間在總結吧~

可學習文章連接

http://blog.jobbole.com/52477/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章