博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS-----使用NSURLConnection
阅读量:5278 次
发布时间:2019-06-14

本文共 7450 字,大约阅读时间需要 24 分钟。

使用NSURLConnection   

如果只是为了读取HTTP等服务器数据,或向服务器提交数据,iOS还提供了NSURLConnection类,NSURLConnection使用NSURLRequest向远程服务器发送同步或异步请求,并获取服务器响应的数据。除了NSURLRequest之外,还可使用NSMutableURLRequest向服务器发送数据。

使用NSURLConnection从网络获取数据

  NSURLConnection可用于根据URL加载服务器响应,该对象的方法并不多,如果使用该对象来异步加载服务器响应,则需要为该对象指定一个遵守NSURLConnectionDelegate协议的对象,该对象作为NSURLConnection的delegate,负责处理异步加载过程中的事件。

   除此之外,还可使用NSURLConnection的sendSynchronousRequest:returningResponse:error:类方法同步架子啊服务器响应。

   NSURLConnection大致提供了如下常用的方法。

 

- (NSURLRequest *)originalRequest: 获取该NSURLConnection最初的NSURLRequest对象的深拷贝

- (NSURLRequest *)currentRequest: 返回该NSURLConnection当前使用的NSURLRequest对象

采用同步请求的方式获取网络数据的方法如下

+ sendSynchronousRequest:returningResponse:error:第1个参数代表发送请求的NSURLRequest对象;第2个参数需要传入NSURLRequest对象的指针,用于获取服务器响应对象;第3个参数用于保存获取的错误信息。

采用异步请求的方式获取网络数据的方法如下

+ connectionWithRequest:delegate::采用异步请求的方式获取数据。第2个参数作为NSURLConnection的delegate。

- initWithRequest:delegate: : 与上一个方法基本相同,只是该方法是实例方法,必须先调用alloc,再调用该方法

- initWithRequest:delegate:startImmediately:: 与前一个方法的功能基本相似,只是多了一个startImmediately参数,该参数控制是否立即发送请求

+ sendAsynchronousRequest:queue:completionHandler: : 该方法需要额外指定NSOperationQueue参数,表明将请求交给指定的NSOperationQueue处理.

-  start: 开始发送请求.只是当通过- initWithRequest:delegate:startImmediately:方法发送请求,且最后一个参数为NO时,才需要调用该方法。

使用NSURLConnection从网络获取数据的步骤如下

1.        创建NSURLRequest对象,该对象代表对远程服务器的请求。该对象可以包括请求的URL、缓存策略、超时时长等信息。

2.        调用NSURLConnection的实例方法或类方法,以NSURLRequest对象为参数创建NSURLConnection即可发送请求。

3.        如果调用方法以异步方式加载服务器响应,则需要为NSURLConnection对象指定delegate对象,因此还需要为delegete对象实现特定的方法。

代码片段

ViewController.m@implementation ViewControllerNSMUtableData* totalData;- (void)viewDidLoad{  [super viewDidLoad];  NSString* str = @http://www.crazyit.ory/ethos.php; totalData = [[NSMutableData alloc] init];  // 以指定NSString创建NSURL对象 NSURL * url = [NSURL URLWithString:str]; // 创建NSURLRequest对象  // NSURLRequest* request = [NSURLRequest requestWithURL:url];// 通过这种方式创建的NSURLRequest可以指定缓存策略、超时时长NSURLRequest* request = [NSURLRequest requestWithURL:urlcachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5];// 以指定URL、delegate创建连接、发送请求NSURLConnection* conn = [NSURLConnection  connectionWithRequest:request delegate:self ];// 如果conn为nil,则直接返回if(conn !=nil){  return;}}//  当服务器响应生成时激发该方法- (void)connection: (NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{  NSLog(@”++didReceiveResponse++”);  NSLog(@”响应的数据类型:: %@” , response.MIMEType);  // 获取响应数据的长度,如果不能检测到长度,则返回NSURLResponseUnknownLength(-1)  NSLog(@”响应的数据长度为: %lld”,  response.expectedContentLength);  NSLog(@”响应的数据所使用的字符集: %@”, response.textEncodingName); NSLog(@”响应的文件名: %@”, response.suggestedFilename);}// 每次读取服务器响应的数据时,都会激发该方法// 对于一个请求而言,服务器数据可能要分几次才能读取,因此该方法将会被处罚多次// 如果程序需要将这些数据转换成字符串,则建议使用NSMutableData来收集这些数据.然后整体转换- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*) data{   [totalData appendData:data];}// 当连接服务器出现错误时激发该方法.可通过error获取错误信息- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{   NSLog(@”++error++”);}// 当数据load完成时激发该方法.对于每次请求,该方法只会被激发一次- (void)connectionDidFinishLoading:(NSURLConnection *)connection{  NSLog(@”++finishLoading++”);  NSString* content = [[NSString alloc] initWithData:totalDataencoding:NSUTF8StringEncoding];// 清空所有数据[totalData  setLength:0];self.showView.text = content;}@end

 

  上面程序中的第1行红色字代码创建了一个NSURLRequest对象,第2行红色字代码以NSURLRequest对象为参数,以该视图控制器本身作为delegate,创建了NSURLConnection对象,创建该对象即可向远程服务器发送请求。

   由于程序制定使用视图控制器本身作为NSURLConnectiondelegate,因此该视图控制器实现了NSURLConnectionDataDelegate协议,并实现了该协议中几个特定的方法。

   随着服务器响应的到来,NSURLConnectiondelegate对象的如下方法依次被调用

1.        connection:didReceiveResponse: 当服务器响应到来时,激发该方法

2.        connection: didReceiveData: 每次读取服务器响应的数据时,都会激发该方法.对于一个请求而言, 服务器数据可能要分几次才能读取, 因此该方法将会被触发多次.

3.        connectionDidFinishLoading: 服务器响应读取完成时激发该方法.

 
 

 

 

使用NSMutableURLRequest向服务器发送数据

  NSMutableURLRequest不仅可以添加请求头,还可以添加请求参数,这样即可向服务器发送数据了.

NSMutableURLRequest新增了如下常用方法

- addValue:forHTTPHeaderField: 该方法用于为NSMutableURLRequest添加请求头

- setAllHTTPHeaderFields: 该方法通过一个NSDictionary一次性地为NSMutableURLRequest设置多个请求头

- setHTTPBody: 设置NSMutableURLRequest的请求体数据-----也就是设置请求参数

- setHTTPBodyStream: 以NSInputStream为参数设置NSMutableURLRequest的请求体数据.该方法与setHTTPBody方法只能设置一个

-  setHTTPMethod: 设置提交请求的方式,要么是POST,要么是GET, 默认是GET.

-  setHTTPShouldHandleCookies: 设置该HTTP请求是否处理Cookie.

-  setValue:forHTTPHeaderField: 为指定的请求头设置请求值

代码示例

1 ViewController.m  2   3 @implementation ViewController  4   5 NSMutableData* totalData;  6   7 - (void)viewDidLoad  8   9 { 10  11    [super viewDidLoad]; 12  13    NSString* str = @”http://192.168.1.88.8888/abc/login.jsp”; 14  15    totalData = [[NSMutableData alloc] init]; 16  17    // 以指定NSString创建NSURL对象 18  19    NSURL* url = [NSURL URLWithString:str]; 20  21    // 创建NSURLRequest对象 22  23    // NSURLRequest* request = [NSURLRequest requestWithURL: url]; 24  25    // 通过这种方式创建的NSURLRequest可以指定缓存策略、超时时长 26  27    NSMutableURLRequest* request = [NSMutableURLRequest  requestWithURL:url 28  29 cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 30  31 timeoutInterval:5]; 32  33 // --------------------下面代码开始设置请求参数-------------------- 34  35 // 准备请求参数 36  37 NSString* post = [NSString stringWithFormat:@”name=%@&pass=%@”, @”crazyit.org”,  @”疯狂软件”]; 38  39 // 将请求参数转换为NSData 40  41 NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding]; 42  43 NSString *postLength = [NSString stringWithFormat:@”%d”, [postData length]]; 44  45 // 设置请求的方式,默认发送GET请求 46  47 [request setHTTPMethod:@”POST”]; 48  49 //  添加两个请求头 50  51 [request  setValue:postLength  forHTTPHeaderField:@”Content-Length”]; 52  53 [request  setValue:@”application/x-www-form-urlencoded” 54  55 forHTTPHeaderField:@”Content-Type”]; 56  57        // 将请求数据设置为HTTP请求体 58  59        [request  setHTTPBody:postData]; 60  61        // 以指定URL、delegate创建连接、发送请求 62  63        NSURLConnection* conn = [NSURLConnection connectionWithRequest:request 64  65 delegate:self]; 66  67 // 如果conn为nil,则直接返回 68  69 if(conn != nil) 70  71 { 72  73    return; 74  75 } 76  77 } 78  79 //  当服务器响应生成时激发该方法 80  81 - (void)connection: (NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 82  83 { 84  85   NSLog(@”++didReceiveResponse++”); 86  87   NSLog(@”响应的数据类型:: %@” , response.MIMEType); 88  89   // 获取响应数据的长度,如果不能检测到长度,则返回NSURLResponseUnknownLength(-1) 90  91   NSLog(@”响应的数据长度为: %lld”,  response.expectedContentLength); 92  93   NSLog(@”响应的数据所使用的字符集: %@”, response.textEncodingName); 94  95  NSLog(@”响应的文件名: %@”, response.suggestedFilename); 96  97 } 98  99 // 每次读取服务器响应的数据时,都会激发该方法100 101 // 对于一个请求而言,服务器数据可能要分几次才能读取,因此该方法将会被处罚多次102 103 // 如果程序需要将这些数据转换成字符串,则建议使用NSMutableData来收集这些数据.然后整体转换104 105 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*) data106 107 {108 109    [totalData appendData:data];110 111 }112 113 // 当连接服务器出现错误时激发该方法.可通过error获取错误信息114 115 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error116 117 {118 119    NSLog(@”++error++”);120 121 }122 123 // 当数据load完成时激发该方法.对于每次请求,该方法只会被激发一次124 125 - (void)connectionDidFinishLoading:(NSURLConnection *)connection126 127 {128 129   NSLog(@”++finishLoading++”);130 131   NSString* content = [[NSString alloc] initWithData:totalData132 133 encoding:NSUTF8StringEncoding];134 135 // 清空所有数据136 137 [totalData  setLength:0];138 139 self.showView.text = content;140 141 }142 143 @end

 

  上面程序的关键在于红色字代码部分,该红色字代码设置了发送POST请求,而且将一个形如”name = crazyit.org&pass=疯狂软件”的字符串转换成NSData后作为请求参数,并根据请求参数设置了两个请求头的值-----这样就得到了一个带请求参数的NSMutableURLRequest

转载于:https://www.cnblogs.com/congli0220/p/5058677.html

你可能感兴趣的文章
使用XML传递数据
查看>>
TYVJ.1864.[Poetize I]守卫者的挑战(概率DP)
查看>>
0925 韩顺平java视频
查看>>
iOS-程序启动原理和UIApplication
查看>>
mysql 8.0 zip包安装
查看>>
awk 统计
查看>>
模板设计模式的应用
查看>>
实训第五天
查看>>
平台维护流程
查看>>
2012暑期川西旅游之总结
查看>>
12010 解密QQ号(队列)
查看>>
2014年辛星完全解读Javascript第一节
查看>>
装配SpringBean(一)--依赖注入
查看>>
java选择文件时提供图像缩略图[转]
查看>>
方维分享系统二次开发, 给评论、主题、回复、活动 加审核的功能
查看>>
Matlab parfor-loop并行运算
查看>>
string与stringbuilder的区别
查看>>
2012-01-12 16:01 hibernate注解以及简单实例
查看>>
iOS8统一的系统提示控件——UIAlertController
查看>>
PAT甲级——1101 Quick Sort (快速排序)
查看>>