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 還剩兩個功能(下載、上傳)沒演示,後面有時間在總結吧~
可學習文章連接