使用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对象,创建该对象即可向远程服务器发送请求。

   由于程序制定使用视图控制器本身作为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: 为指定的请求头设置请求值

代码示例

 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的更多相关文章

  1. iOS使用NSURLConnection发送同步和异步HTTP Request

    1. 同步发送 - (NSString *)sendRequestSync { // 初始化请求, 这里是变长的, 方便扩展 NSMutableURLRequest *request = [[NSMu ...

  2. iOS网络NSURLConnection使用详解

    一.整体介绍 NSURLConnection是苹果提供的原生网络访问类,但是苹果很快会将其废弃,且由NSURLSession(iOS7以后)来替代.目前使用最广泛的第三方网络框架AFNetworkin ...

  3. iOS ---------NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

    遇到此问题的解决办法: 使用<NSURLSessionDelegate>中的didReceiveChallenge方法,方法中的代码如下: - (void)URLSession:(NSUR ...

  4. iOS图片瘦身总结

    前言 最近在公司写了个小程序来为iOS应用中的图片瘦身,进而减小APP大小,减少用户下载时的流量. 瘦身是在一个专门为图片瘦身的网站进行的. 地址:https://tinypng.com 这个网站提供 ...

  5. Silverlight项目笔记6:Linq求差集、交集&检查网络连接状态&重载构造函数复用窗口

    1.使用Linq求差集.交集 使用场景: 需要从数据中心获得用户数据,并以此为标准,同步系统的用户信息,对系统中多余的用户进行删除操作,缺失的用户进行添加操作,对信息更新了的用户进行编辑操作更新. 所 ...

  6. iOS开发 GET、POST请求方法(NSURLConnection篇)

    Web Service使用的主要协议是HTTP协议,即超文本传输协议. HTTP/1.1协议共定义了8种请求方法(OPTIONS.HEAD.GET.POST.PUT.DELETE.TRACE.CONN ...

  7. iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充

    一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...

  8. iOS开发——网络篇——HTTP/NSURLConnection(请求、响应)、http响应状态码大全

    一.网络基础 1.基本概念> 为什么要学习网络编程在移动互联网时代,移动应用的特征有几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图只有通过网络跟外界进行数据交互.数据更新, ...

  9. iOS网络学习之“远离NSURLConnection 走进NSURLSession”

    目前,在iOS的开发中,NURLConnection已经成为了过去式,现在的NSURLConnection已经deprected(iOS7之后),取而代之的是NSURLSession.而且AFNetw ...

  10. iOS开发网络篇—NSURLConnection基本使用

    iOS开发网络篇—NSURLConnection基本使用 一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据 ...

随机推荐

  1. java数组声明和变式--record1

    ​ java声明数组方式: String[] namelist; int numlist[];//此声明为动态声明,不能指定长度,numlist[10] 静态声明的方式: int a[]={1,2,3 ...

  2. jq expando && $.data()

    1.使用隐藏控件或者是js全局变量来临时存储数据,全局变量容易导致命名污染,隐藏控件导致经常读写dom浪费性能 jQuery提供了自己的数据缓存方案,使用jQuery数据缓存方案,我们需要掌握$.da ...

  3. Android Fragment与Activity通讯详解

    与activity通讯 尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一个fragment的不同的实例. Fragment可 ...

  4. Unity中的文件

    Unity中的文件大致分为一下几类: 1.资源文件: 导入后,除非是修改,否则不会变化的文件.例如:fbx文件.贴图文件.音频文件.视频文件.动画文件等. 这些文件在导入到Unity的时候,都会进行转 ...

  5. grub 启动错误 "file not found"

    刚安装ubuntu 14.4 竟然出现这么尴尬的事,ubuntu 行不行? 幸好还是能从u盘启动后,转到硬盘. 然后在网上找到了解决方法. http://askubuntu.com/questions ...

  6. 雷林鹏分享:Ruby 注释

    Ruby 注释 注释是在运行时会被忽略的 Ruby 代码内的注释行.单行注释以 # 字符开始,直到该行结束,如下所示: #!/usr/bin/ruby -w # 这是一个单行注释. puts &quo ...

  7. linux下修改mysql登录密码

    一.修改mysql密码 1.停止服务      /etc/init.d/mysqld stop   2.以不检查权限的方式启动     /etc/init.d/mysqld --skip-grant- ...

  8. bzoj4025: 二分图 lct

    题意:带增删边的查询二分图 题解:因为二分图肯定带奇环,lct维护,每次要加入一条边之前判断会不会构成环,如果会就把最先会删除的边删掉,然后如果是奇环就打个标记,然后把奇环数++,删除的时候,把标记删 ...

  9. Mac安装zsh oh-my-zsh

    我们将安装 zsh ,其拓展功能和主题将由 oh-my-zsh 提供.其中Env.sh 文件用于维护别名(aliases),输出(exports)和路径改变(path changes)等等,以免影响  ...

  10. spark collect获取所有元素

    from pyspark import SparkConf, SparkContext conf = SparkConf().setMaster("local").setAppNa ...