iOS-----使用NSURLConnection
使用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 ViewController NSMUtableData* 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:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:]; // 以指定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:totalData encoding:NSUTF8StringEncoding]; // 清空所有数据 [totalData setLength:]; self.showView.text = content; } @end |
|||
上面程序中的第1行红色字代码创建了一个NSURLRequest对象,第2行红色字代码以NSURLRequest对象为参数,以该视图控制器本身作为delegate,创建了NSURLConnection对象,创建该对象即可向远程服务器发送请求。 由于程序制定使用视图控制器本身作为NSURLConnection的delegate,因此该视图控制器实现了NSURLConnectionDataDelegate协议,并实现了该协议中几个特定的方法。 随着服务器响应的到来,NSURLConnection的delegate对象的如下方法依次被调用
|
使用NSMutableURLRequest向服务器发送数据
NSMutableURLRequest不仅可以添加请求头,还可以添加请求参数,这样即可向服务器发送数据了.
NSMutableURLRequest新增了如下常用方法 |
- addValue:forHTTPHeaderField: 该方法用于为NSMutableURLRequest添加请求头 |
- setAllHTTPHeaderFields: 该方法通过一个NSDictionary一次性地为NSMutableURLRequest设置多个请求头 |
- setHTTPBody: 设置NSMutableURLRequest的请求体数据-----也就是设置请求参数 |
- setHTTPBodyStream: 以NSInputStream为参数设置NSMutableURLRequest的请求体数据.该方法与setHTTPBody方法只能设置一个 |
- setHTTPMethod: 设置提交请求的方式,要么是POST,要么是GET, 默认是GET. |
- setHTTPShouldHandleCookies: 设置该HTTP请求是否处理Cookie. |
- setValue:forHTTPHeaderField: 为指定的请求头设置请求值 |
代码示例 |
ViewController.m @implementation ViewController NSMutableData* totalData; - (void)viewDidLoad { [super viewDidLoad]; NSString* str = @”http://192.168.1.88.8888/abc/login.jsp”; totalData = [[NSMutableData alloc] init]; // 以指定NSString创建NSURL对象 NSURL* url = [NSURL URLWithString:str]; // 创建NSURLRequest对象 // NSURLRequest* request = [NSURLRequest requestWithURL: url]; // 通过这种方式创建的NSURLRequest可以指定缓存策略、超时时长 NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:]; // --------------------下面代码开始设置请求参数-------------------- // 准备请求参数 NSString* post = [NSString stringWithFormat:@”name=%@&pass=%@”, @”crazyit.org”, @”疯狂软件”]; // 将请求参数转换为NSData NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding]; NSString *postLength = [NSString stringWithFormat:@”%d”, [postData length]]; // 设置请求的方式,默认发送GET请求 [request setHTTPMethod:@”POST”]; // 添加两个请求头 [request setValue:postLength forHTTPHeaderField:@”Content-Length”]; [request setValue:@”application/x-www-form-urlencoded” forHTTPHeaderField:@”Content-Type”]; // 将请求数据设置为HTTP请求体 [request setHTTPBody:postData]; // 以指定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:totalData encoding:NSUTF8StringEncoding]; // 清空所有数据 [totalData setLength:]; self.showView.text = content; } @end |
上面程序的关键在于红色字代码部分,该红色字代码设置了发送POST请求,而且将一个形如”name = crazyit.org&pass=疯狂软件”的字符串转换成NSData后作为请求参数,并根据请求参数设置了两个请求头的值-----这样就得到了一个带请求参数的NSMutableURLRequest |
iOS-----使用NSURLConnection的更多相关文章
- iOS使用NSURLConnection发送同步和异步HTTP Request
1. 同步发送 - (NSString *)sendRequestSync { // 初始化请求, 这里是变长的, 方便扩展 NSMutableURLRequest *request = [[NSMu ...
- iOS网络NSURLConnection使用详解
一.整体介绍 NSURLConnection是苹果提供的原生网络访问类,但是苹果很快会将其废弃,且由NSURLSession(iOS7以后)来替代.目前使用最广泛的第三方网络框架AFNetworkin ...
- iOS ---------NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
遇到此问题的解决办法: 使用<NSURLSessionDelegate>中的didReceiveChallenge方法,方法中的代码如下: - (void)URLSession:(NSUR ...
- iOS图片瘦身总结
前言 最近在公司写了个小程序来为iOS应用中的图片瘦身,进而减小APP大小,减少用户下载时的流量. 瘦身是在一个专门为图片瘦身的网站进行的. 地址:https://tinypng.com 这个网站提供 ...
- Silverlight项目笔记6:Linq求差集、交集&检查网络连接状态&重载构造函数复用窗口
1.使用Linq求差集.交集 使用场景: 需要从数据中心获得用户数据,并以此为标准,同步系统的用户信息,对系统中多余的用户进行删除操作,缺失的用户进行添加操作,对信息更新了的用户进行编辑操作更新. 所 ...
- iOS开发 GET、POST请求方法(NSURLConnection篇)
Web Service使用的主要协议是HTTP协议,即超文本传输协议. HTTP/1.1协议共定义了8种请求方法(OPTIONS.HEAD.GET.POST.PUT.DELETE.TRACE.CONN ...
- iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充
一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...
- iOS开发——网络篇——HTTP/NSURLConnection(请求、响应)、http响应状态码大全
一.网络基础 1.基本概念> 为什么要学习网络编程在移动互联网时代,移动应用的特征有几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图只有通过网络跟外界进行数据交互.数据更新, ...
- iOS网络学习之“远离NSURLConnection 走进NSURLSession”
目前,在iOS的开发中,NURLConnection已经成为了过去式,现在的NSURLConnection已经deprected(iOS7之后),取而代之的是NSURLSession.而且AFNetw ...
- iOS开发网络篇—NSURLConnection基本使用
iOS开发网络篇—NSURLConnection基本使用 一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据 ...
随机推荐
- JavaScript中对象数组 作业题目以及作业
var BaiduUsers = [], WechatUsers = []; var User = function(id, name, phone, gender, age, salary) { t ...
- Asp.net Ajax(ashx)
主要实现 ajax分页功能 效果图 后台方法代码展示 /// <summary> /// WebAjax处理类 /// </summary> public class WebA ...
- MongoDB(课时24 全文索引)
3.6.3 全文索引 在一些信息管理平台上经常需要进行信息模糊查询,最早的时候是利用了某个字段上实现的模糊查询,但这个时候返回的信息并不会很准确,因为只能够查A字段或B字段,而在MongoDB里面实现 ...
- JavaMai——邮箱验证用户注册
这篇文章简单的模拟了网上利用邮箱激活用户注册这样的一个功能 1. 呈现给用户的注册界面:(为了简单起见,就剩下两个输入域,邮箱和昵称) <%@ page language="java& ...
- [ios]关于ios开发图片尺寸的建议
1.以后的应用程序,都使用AutoLayout, 不要再用绝对定位. 2.使用类似网页的方式来设计界面. 3.设计师好,程序员也好,尽量使用点这个单位进行思考,而不要使用像素.比如,你需要做44 x ...
- select exists 的应用一例
当遇到多层exists的时候,事情就变得开始复杂了.我们来看看这个例子吧 假设有三张表 选课表:学号.课程号 学生表:学号.姓名 课程表:课程号.课程名 请选出选了所有课程的学生 SELECT 姓名 ...
- Confluence 6 使用 LDAP 授权连接一个内部目录 - Schema 设置
基本 DN(Base DN) 根专有名称(DN),这个名称在你对目录服务器上进行查询的时候使用.例如: o=example,c=com cn=users,dc=ad,dc=example,dc=com ...
- POJ-2689 Prime Distance (两重筛素数,区间平移)
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13961 Accepted: 3725 D ...
- 在EO中获取某字段基于表的列名
//生成EO的时候自动生成的字段 public static final int BRIEFINTRO = 88; String[][] str = null; str = new String[][ ...
- PaodingAnalysis 提示 "dic home should not be a file, but a directory"
Exception in thread "main" net.paoding.analysis.exception.PaodingAnalysisException: dic ho ...