标签:
注意:iOS9引入了新特性App Transport Security(ATS),新特性要求App内访问的网络必须使用HTTPS协议,如果你解析的网络使用的是HTTP协议,解决的方法有两个:
1、在info.plist文件中添加以下代码
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2、可视化
注意:若网址字符串URLString中有类对象,可以使用此方法处理:
[URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
弊端:会造成卡顿,真正的开发中不建议使用
NSURLConnection在iOS9之后被弃用,在以后的开发中很少见,取而代之的是NSURLSession
1 #pragma mark - 同步GET请求 2 - (IBAction)getSynchronousRequest:(UIButton *)sender { 3 // 1、创建URL 4 NSURL *url = [NSURL URLWithString:GET_URL]; 5 // 2、根据url创建具体的请求(使用缓存策略) 6 // 参数1:统一资源定位符url 7 /** 8 * 参数2:缓存策略(枚举值) 9 NSURLRequestUseProtocolCachePolicy = 0 基础缓存策略,使用Protocol协议定义。 10 NSURLRequestReloadIgnoringLocalCacheData = 1 忽略本地的缓存,所有的数据都从网络获取 11 NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4 忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。 12 NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, 忽略本地的缓存,所有的数据都从网络获取 13 NSURLRequestReturnCacheDataElseLoad = 2, 首先使用缓存,如果没有本地缓存,才从原地址下载 14 NSURLRequestReturnCacheDataDontLoad = 3, 使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作 15 NSURLRequestReloadRevalidatingCacheData = 5, 如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载 16 http://blog.csdn.net/dean19900504/article/details/8134720 17 */ 18 19 // 参数3:设置延迟时间,如果超时,请求终止 20 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20]; 21 // 3、链接服务器 [NSURLConnection在iOS9之后被弃用,在以后的开发中很少见] 22 // 参数1:请求对象 23 // 参数2:存储一些网络请求的信息(一般为包体) 一般为nil 24 // 参数3:错误信息 25 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 26 // 4、进行json数据解析 27 NSDictionary *resultDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 28 NSLog(@"resultDict = %@", resultDict); 29 }
1 #pragma mark - 同步POST请求 2 - (IBAction)postSynchronousRequest:(UIButton *)sender { 3 // 1、创建URL 4 NSURL *url = [NSURL URLWithString:POST_URL]; 5 // 2、创建可变的网络请求[post请求必须初始化为可变请求,因为稍后要进行一些内容的设置] 6 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 7 // 2.5、设置body 8 // 创建一个连接字符串(这个内容在以后的开发中接口文档都有标注) 9 NSString *dataString = POST_BODY; 10 // 对连接字符串进行编码【千万不能忘记】 11 NSData *postData = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 12 // 设置请求格式为POST (POST必须大写) 13 [request setHTTPMethod:@"POST"]; 14 // 设置请求体(body) 15 [request setHTTPBody:postData]; 16 // 3、连接服务器 17 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 18 // 4、解析JSON数据 19 NSDictionary *resultDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 20 NSLog(@"%@", resultDict); 21 }
1 #pragma mark - get异步请求 2 #pragma mark - block方法 3 - (IBAction)getAsynchronousRequestWithBlock:(UIButton *)sender { 4 // 1、创建URL 5 NSURL *url = [NSURL URLWithString:GET_URL]; 6 // 2、创建请求 7 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 8 // 3、连接服务器 9 // 参数1:请求对象 10 // 参数2:线程队列 11 // 参数3:block 12 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 13 // response:是携带的接口信息 14 // data:请求下来的数据,接下来会使用到 15 // connectionError:错误信息 16 17 if (connectionError == nil) { 18 // 4、解析 19 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 20 NSLog(@"%@", dict); 21 22 // 先开辟子线程解析数据 23 // 然后在主线程里刷新UI 24 } 25 26 }]; 27 }
1 #pragma mark - get异步请求 2 #pragma mark - 代理方法 3 - (IBAction)getAsynchronousRequestWithDelegate:(UIButton *)sender { 4 // 1、创建URL 5 NSURL *url = [NSURL URLWithString:GET_URL]; 6 // 2、创建请求 7 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 8 // 3、连接服务器,设置代理 9 [NSURLConnection connectionWithRequest:request delegate:self]; 10 11 } 12 13 #pragma mark - NSURLConnectionDataDelegate相关代理方法 14 #pragma mark - 服务器开始响应 15 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 16 // 初始化数据 17 self.resultData = [NSMutableData data]; 18 } 19 20 #pragma mark - 接收数据 21 // 这个方法会重复执行,将得到的每段数据拼接在一起 22 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 23 // 数据拼接 24 [self.resultData appendData:data]; 25 } 26 27 #pragma mark - 结束服务器 28 - (void)connectionDidFinishLoading:(NSURLConnection *)connection { 29 // 解析数据 30 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.resultData options:NSJSONReadingAllowFragments error:nil]; 31 NSLog(@"dict = %@", dict); 32 }
1 #pragma mark - post异步请求 2 #pragma mark - block方法 3 - (IBAction)postAsynchronousRequestWithBlock:(UIButton *)sender { 4 // 1、创建URL 5 NSURL *url = [NSURL URLWithString:POST_URL]; 6 // 2、创建可变网络请求 7 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 8 // 2.5、设置body 9 NSString *dataString = POST_BODY; 10 // 对连接字符串进行编码 11 NSData *postData = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 12 // 设置请求格式为POST 13 [request setHTTPMethod:@"POST"]; 14 // 设置请求体 15 [request setHTTPBody:postData]; 16 // 3、连接服务器 17 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { 18 if (connectionError == nil) { 19 // 4、解析JSON数据 20 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 21 NSLog(@"%@", dict); 22 } 23 }]; 24 25 }
1 #pragma mark -post异步请求 2 #pragma mark - 代理方法 3 - (IBAction)postAsynchronousRequestWithDelegate:(UIButton *)sender { 4 // 1、创建URL 5 NSURL *url = [NSURL URLWithString:POST_URL]; 6 // 2、创建可变网络请求 7 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 8 // 2.5、设置body 9 NSString *dataString = POST_BODY; 10 // 对连接字符串进行编码 11 NSData *postData = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 12 // 设置请求格式为POST 13 [request setHTTPMethod:@"POST"]; 14 // 设置请求体 15 [request setHTTPBody:postData]; 16 // 3、代理方法 17 [NSURLConnection connectionWithRequest:request delegate:self]; 18 } 19 #pragma mark - NSURLConnectionDataDelegate相关代理方法 20 #pragma mark - 服务器开始响应 21 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 22 // 初始化数据 23 self.resultData = [NSMutableData data]; 24 } 25 26 #pragma mark - 接收数据 27 // 这个方法会重复执行,将得到的每段数据拼接在一起 28 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 29 // 数据拼接 30 [self.resultData appendData:data]; 31 } 32 33 #pragma mark - 结束服务器 34 - (void)connectionDidFinishLoading:(NSURLConnection *)connection { 35 // 解析数据 36 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.resultData options:NSJSONReadingAllowFragments error:nil]; 37 NSLog(@"dict = %@", dict); 38 }
1 #pragma mark - get异步请求(block) 2 - (IBAction)getRequestWithBlock:(UIButton *)sender { 3 // 1、创建URL 4 NSURL *url = [NSURL URLWithString:GET_URL]; 5 // 2、创建Session对象 6 NSURLSession *session = [NSURLSession sharedSession]; 7 // 3、创建task请求任务 8 // NSURLSession是基于任务去完成相关的事件的。 9 // NSURLSessionDataTask,所有的任务均放在这里实现。(对数据进行加载,使用NSURLSessionDataTask和NSURLSessionTask,没有本质区别;要处理下载任务的使用:NSURLSessionDownloadTask; 要处理上传任务时使用:NSURLSessionUploadTask) 10 NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 11 if (error == nil) { 12 // 4、解析相关数据 13 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 14 NSLog(@"dict = %@", dict); 15 } 16 }]; 17 // 5、核心步骤:启动任务。-- NSURLSessionTask的实例如果不启动,会处于挂起状态,不会走block中实现的内容 18 [task resume]; 19 }
1 #pragma mark - get异步请求(代理) 2 - (IBAction)getRequestWithDelegate:(UIButton *)sender { 3 // 1、创建URL 4 NSURL *url = [NSURL URLWithString:GET_URL]; 5 // 2、创建session 6 /** 7 参数1:模式的设置 8 defaultSessionConfiguration 默认会话模式 9 ephemeralSessionConfiguration 瞬间会话模式 10 backgroundSessionConfigurationWithIdentifier: 后台会话模式 11 */ 12 // 参数2:代理 13 // 参数3:线程队列 14 NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 15 // 4、创建task 16 NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:url]]; 17 // 核心步骤:启动任务 18 [task resume]; 19 } 20 21 #pragma mark - NSURLSessionDataDelegate协议的方法实现 22 // 服务器开始响应 23 - (void)URLSession:(NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveResponse:(nonnull NSURLResponse *)response completionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler { 24 // 允许服务器响应,只有允许服务器响应,才会接收到数据 25 completionHandler(NSURLSessionResponseAllow); 26 // 初始化data,稍后进行拼接 27 self.resultData = [NSMutableData data]; 28 } 29 30 // 接收数据 31 // 这个方法会进行多次,将得到的每个data拼接到一起 32 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { 33 // 拼接 34 [self.resultData appendData:data]; 35 } 36 37 // 数据接收完成,网络请求结束 38 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { 39 // 解析数据 40 if (error == nil) { 41 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.resultData options:NSJSONReadingAllowFragments error:nil]; 42 NSLog(@"dict = %@", dict); 43 } 44 }
1 #pragma mark - post异步请求(block) 2 - (IBAction)postRequestWithBlock:(UIButton *)sender { 3 // 1、创建URL 4 NSURL *url = [NSURL URLWithString:POST_URL]; 5 // 2、创建网络请求 6 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 7 // 2.5、设置body 8 NSString *bodyString = POST_BODY; 9 NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; 10 [request setHTTPMethod:@"POST"]; 11 [request setHTTPBody:bodyData]; 12 13 // 3、创建session 14 NSURLSession *session = [NSURLSession sharedSession]; 15 // 4、创建task 16 NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 17 if (error == nil) { 18 // 5、解析数据 19 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 20 NSLog(@"dict = %@", dict); 21 } 22 }]; 23 // 6、启动任务 24 [task resume]; 25 26 }
1 #pragma mark - post异步请求(代理) 2 - (IBAction)postRequestWithDelegate:(UIButton *)sender { 3 // 1、创建URL 4 NSURL *url = [NSURL URLWithString:POST_URL]; 5 // 2、创建网络请求 6 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 7 // 2.5、设置body 8 NSString *bodyString = POST_BODY; 9 NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; 10 [request setHTTPMethod:@"POST"]; 11 [request setHTTPBody:bodyData]; 12 13 // 3、创建session 14 NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 15 NSURLSessionDataTask *task = [session dataTaskWithRequest:request]; 16 [task resume]; 17 18 } 19 20 #pragma mark - NSURLSessionDataDelegate协议的方法实现 21 // 服务器开始响应 22 - (void)URLSession:(NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveResponse:(nonnull NSURLResponse *)response completionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler { 23 // 允许服务器响应,只有允许服务器响应,才会接收到数据 24 completionHandler(NSURLSessionResponseAllow); 25 // 初始化data,稍后进行拼接 26 self.resultData = [NSMutableData data]; 27 } 28 29 // 接收数据 30 // 这个方法会进行多次,将得到的每个data拼接到一起 31 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { 32 // 拼接 33 [self.resultData appendData:data]; 34 } 35 36 // 数据接收完成,网络请求结束 37 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { 38 // 解析数据 39 if (error == nil) { 40 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.resultData options:NSJSONReadingAllowFragments error:nil]; 41 NSLog(@"dict = %@", dict); 42 } 43 }
HTTP是超文本传输协议,HTTPS是安全超文本传输协议
GET和POST是请求方式
同步,异步是连接方式
网络请求的步骤:1、NSURL;2、NSURLRequest;3、NSURLConnection;4、处理Error或者返回数据
NSURLSession是iOS7中新的网络处理方式,NSURLConnection在iOS较早版本中使用广泛。
标签:
原文地址:http://www.cnblogs.com/fearlessyyp/p/5483794.html