iOS-进阶整理05 - 网络请求Session与Connection

一、网络请求的基本知识

1.get方法与post方法
  1. get是从服务器上获取数据,post是向服务器传送数据。
  1. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应, 在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起 传送到ACTION属性所指的URL地址。用户看不到这个过程。
  2. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request. Form获取提交的数据。
    4.get是明文传输,post是转为NSData

还是不明白,回头再看这篇原创文章讲了些post和get的问题,观点有些不同http://www.nowamagic.net/librarys/veda/detail/1919这是400、500、301、200等网站状态码的含义
http://www.maolvge.cn/news/jianzhanchangshi/29.html2.

2.同步和异步

同步:提交请求->等待服务器处理->处理完毕返回
这个期间客户端浏览器不能干任何事
异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕session自己内部封装了线程,不存在同步请求的问题了

3.NSURLConnection和NSURLConnection

iOS7以前,使用的都是NSURLConnection在WWDC2013中,推出了NSURLSession作为替代。下面这篇文章比较清楚地讲了NSURLConnection和NSURLSession的一些区别和内容URLSession是一种任务模式iOS 7系列译文:忘记NSURLConnection,拥抱NSURLSession吧!

4.设置Info.plist文件

添加一条App Transport Secutity Settings把其下的Allow Arbitrary Loads 属性改为YES

二、使用NSURLConnection

1.get方法
//get的同步请求  
-(void)getAndSynchronize  
{  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    //得到网址  
    NSURL *url = [NSURL URLWithString:urlStr];  
    //创建请求  
    NSURLRequest *req = [NSURLRequest requestWithURL:url];  
    //创建同步链接  
    NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];  
      
    //json解析  
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];  
    NSLog(@"11%@",dic);        
}  
  
//get的异步请求,使用block方法  
-(void)getAndAsynchronize  
{  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    //得到网址  
    NSURL *url = [NSURL URLWithString:urlStr];  
    //创建请求  
    NSURLRequest *req = [NSURLRequest requestWithURL:url];  
      
    __block NSDictionary *dic = [NSDictionary dictionary];  
    //创建异步  
    [NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {  
      
        dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];  
        NSLog(@"%@",dic);  
    }];  
    NSLog(@"异步链接下面");  
}  
2.post方法同步请求
//post同步请求  
-(void)postAndSynchronize  
{  
    //post请求,一般只包含 协议://host/路径  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";  
    //得到网址  
    NSURL *url = [NSURL URLWithString:urlStr];  
    //请求方式为post,所有要创建为NSMutableURLRequest  
    NSMutableURLRequest *mReq = [[NSMutableURLRequest alloc]initWithURL:url];  
    //设置情感方式,不设置时,默认为GET请求  
    [mReq setHTTPMethod:@"POST"];  
    //创建参数  
    NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];  
    //设置参数  
    [mReq setHTTPBody:pData];  
      
    //建立同步链接  
    NSData *resultData = [NSURLConnection sendSynchronousRequest:mReq returningResponse:nil error:nil];  
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:resultData options:NSJSONReadingAllowFragments error:nil];  
    NSLog(@"%@",dic);  
} 

post方法,使用block和代理方式

//POST异步请求  
-(void)postAndAsynchronize  
{  
    NSString *str = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";  
    NSURL *url = [NSURL URLWithString:str];  
    NSMutableURLRequest *mReq = [NSMutableURLRequest requestWithURL:url];  
    //cahce策略,超时time  
    NSMutableURLRequest *mReq1 = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30];  
      
    [mReq setHTTPMethod:@"POST"];  
    //设置参数  
    NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];  
    [mReq setHTTPBody:pData];  
      
    //1.block  
    __block NSDictionary *dic = [NSDictionary dictionary];  
    //建立异步链接  
    [NSURLConnection sendAsynchronousRequest:mReq queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {  
        dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];  
//        NSLog(@"%@",dic);  
    }];  
            
    //2.使用协议代理方法  
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:mReq delegate:self];  
}  
#pragma mark -- connect的异步代理方法  
  
//开始  
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  
{  
    NSLog(@"开始相应,可以在此代理方法中初始化容器");  
    _mData = [[NSMutableData alloc]init];  
}    
//接收数据,data只是数据片段,不是完整数据,需要拼接  
-(void)connection:(NSURLConnection *)connection didReceiveData:(nonnull NSData *)data  
{  
    NSLog(@"开始返回数据片段");  
      
    [_mData appendData:data];  
}    
//本次链接完成  
-(void)connectionDidFinishLoading:(NSURLConnection *)connection  
{  
    NSLog(@"链接完成");  
    //可以在此解析数据  
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.mData options:NSJSONReadingAllowFragments error:nil];  
    NSLog(@"%@",dic);  
}  
  
//链接出错  
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error  
{  
    NSLog(@"error - %@",error);  
}  

三、使用NSURLSession

1.在WWDC2013中,推出了NSURLSession作为替代。

支持后台运行的网络任务暂停、停止、重启网络任务、不再需要NSOpation封装请求可以使用同样的配置容器不同的session可以使用不同的私有存储,block和代理可以同时起作用直接从文件系统上传下载为了方便程序员使用,苹果提供了一个全局session所有的任务(Task)都是由Session发起的所有的任务默认是挂起的,
需要ResumeNSURLSession的三种工作模式
默认会话模式(default)
瞬间会话模式(ephemeral)
不会有任何缓存后台会话模式(background)
在后台进行网络请求,在没有session以前使用gcd可以让应用程序在进入后台时继续运行0分钟支持三种任务加载瞬间,下载,上传,父类都是NSURLSessionTaskNSURLSessionDataTaskNSURLSessionUploadTaskNSURLSessionDownloadTask1.session get block的方法

//session get block  
-(void)sessionGet  
{  
    //第一种方式创建session,单例,获取全局session对象  
    NSURLSession *session = [NSURLSession sharedSession];  
  
    //第二种方式创建session,可以给session设置工作模式  
//    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];  
//    NSURLSession *session = [NSURLSession sessionWithConfiguration:config];  
      
    //创建url对象  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/ 
    publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    //得到网址  
    NSURL *url = [NSURL URLWithString:urlStr];  
      
//    //建立请求任务.block方式,通过url建立task,不需要建立request  
//    NSURLSessionDataTask *task = [session dataTaskWithURL:url   
      completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)   
      {  
//          
//        //解析数据  
//          
//    }];  
      
    //如果需要设置缓存策略、请求超时等,需要创建请求对象request  
    NSURLRequest *req = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy   
                        timeoutInterval:30];  
      
    //通过request方式建立任务  
    NSURLSessionTask *task = [session dataTaskWithRequest:req   
        completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)   
   {  
        NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];  
        NSLog(@"%@",str);  
    }];        
    //启动任务  
    [task resume];  
}
2.session get 代理方法

导入NSURLSessionDelegate,NSURLSessionDataDelegate协议


//session post delegate  
-(void)sessionDelegate  
{        
    //创建url对象  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";  
    //得到网址  
    NSURL *url = [NSURL URLWithString:urlStr];  
      
    //创建参数  
    NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];  
      
    NSMutableURLRequest *mReq = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];  
    //设置请求超时  
    [mReq setTimeoutInterval:30];  
    [mReq setCachePolicy:NSURLRequestReloadIgnoringCacheData];  
    [mReq setHTTPMethod:@"POST"];  
    [mReq setHTTPBody:pData];  
      
    //代理的方法,主线程  
    NSURLSession *session_1 = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];  
      
    //创建任务(因为要使用代理方法,就不需要block方法初始化)  
    NSURLSessionDataTask *task_1 = [session_1 dataTaskWithRequest:mReq];  
    //启动  
    [task_1 resume];  
}  
  
#pragma mark -- session delegate  
  
//服务器开始响应,准备返回数据  
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler  
{  
    //运行出来服务器的响应  
    completionHandler(NSURLSessionResponseAllow);  
    //当网络请求是基于http协议的时候,response的本质为NSHTTPURLResponse  
//    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;  
      
    //初始化容器  
    _mData = [NSMutableData data];  
}  
  
//客户端接收数据  
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data  
{  
    [_mData appendData:data];  
}  
  
//数据请求完成网络请求成功,当error不为空,说明响应出错  
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error  
{  
    if (error) {  
        NSLog(@"error -- %@",error);  
    }  
    else  
    {  
        NSString *str = [[NSString alloc]initWithData:_mData encoding:NSUTF8StringEncoding];  
        NSLog(@"delegate  -- %@",str);  
    }  
}  
3.session post方法 block
-(void)sessionPost  
{  
    //创建url对象  
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";  
    //得到网址  
    NSURL *url = [NSURL URLWithString:urlStr];  
      
    //创建参数  
    NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";  
    NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];  
    
    //创建request  
  NSMutableURLRequest *mReq = [[NSMutableURLRequest alloc]initWithURL:url   
      cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];  
  
//设置   
    [mReq setHTTPMethod:@"POST"];   
    [mReq setHTTPBody:pData];   
//建session   
    NSURLSession *session = [NSURLSession sharedSession];   
//加载任务的数据对象   
    NSURLSessionTask *task = [session dataTaskWithRequest:mReqcompletionHandler:^  
   (NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)  
   {   
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];   
    NSLog(@"%@",str); }];   
  
//开启任务   
    [task resume];   
}

缓存策略NSURLRequestCachePolicy

1> NSURLRequestUseProtocolCachePolicy = 0, 默认的缓存策略,如果缓存不存在,直接从服务端获取。如果缓存存在,会根据response中的Cache-Control字段判断下一步操作,如:Cache-Control字段为must-revalidata,则询问服务端该数据是否有更新,无更新的话直接返回给用户缓存数据,若已更新,则请求服务端.
2> NSURLRequestReloadIgnoringLocalCacheData = 1,忽略本地缓存数据,直接请求服务端.
3> NSURLRequestIgnoringLocalAndRemoteCacheData = 4,忽略本地缓存,代理服务器以及其他中介,直接请求源服务端.
4> NSURLRequestReloadIgnoringCacheData =NSURLRequestReloadIgnoringLocalCacheData
5> NSURLRequestReturnCacheDataElseLoad= 2, 有缓存就使用,不管其有效性(即忽略Cache-Control字段), 无则请求服务端.
6> NSURLRequestReturnCacheDataDontLoad =3, 死活加载本地缓存. 没有就失败.(确定当前无网络时使用)
7>NSURLRequestReloadRevalidatingCacheData =5, 缓存数据必须得得到服务端确认有效才使用(貌似是NSURLRequestUseProtocolCachePolicy中的一种情况)Tips: URL Loading System默认只支持如下5中协议: 其中只有http://和https://才有缓存策略./(1) http://(2) https://(3) ftp://(4) file://(5) data://

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,639评论 2 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 目录 网络基本概念 TCP/IP协议簇基本概念 HTTP 网络开发技术解决方案 数据解析 网络优化 1. 网络基本...
    Ryan___阅读 1,352评论 1 0
  • http协议有http0.9,http1.0,http1.1和http2三个版本,但是现在浏览器使用的是htt...
    一现_阅读 1,855评论 0 3
  • 电影《扑通扑通我的人生》是一个关于早婚家庭的亲情故事,日常生活中,这样的故事或许并不易见,但类似儿童早衰这样先天性...
    袁园园阅读 293评论 2 2