近几年来,云计算是一个很是热门的技术名词,不少专家认为,云计算会改变互联网的技术基础,甚至会影响整个产业的格局。可能还不少人不了解什么是云计算,简单来讲,就是把用户的数据(好比文档、照片等)、用户须要使用的软件、用户须要搜索的资源都保存在"云端",并不用保存在用户本地。你能够将"云端"看作了一台超级计算机,实际上是由无数台大型服务器组成的。html
如今不少的移动应用也相似于"云计算"的模式,好比新浪微博,用户的数据都是保存在新浪服务器的数据库里面。当用户想在手机上看到本身的微博数据时,大体须要如下几个过程:ios
1.新浪微博手机客户端发送HTTP请求到新浪服务器数据库
2.服务器响应后返回数据给客户端服务器
3.客户端对数据进行解析后以图形界面的形式(如列表形式)呈现给用户网络
网络处理这一块在移动开发中占据着很是重要的地位,咱们这个专题主要来学习iOS网络处理中的HTTP请求。app
若是你想在iOS中发送Http请求的话,有不少方式能够选择,我在这里介绍几个常见的:框架
1> Core Foundation框架中的CFNetwork API:纯C语言的API,性能很是高异步
2> Foundation框架中的NSURLConnection API:Objective-C的API,性能也不错,简单易用性能
1> ASIHttpRequest学习
2> AFNetworking
咱们这个专题主要来研究NSURLConnection的使用,至于第3方框架的学习,网上也有不少资源能够搜索。
众所周知,HTTP的主要请求方式有2种:GET请求和POST请求,接下来先演示下如何发送一个GET请求。
须要注意的是,你最好发送一个异步请求,不要发送同步请求。iOS程序启动后,系统会默认建立一条主线程,也称为UI线程,这条主线程专门用来渲染UI界面、处理UI界面和用户之间的交互,好比处理用户的触摸事件、文本输入事件等。所谓异步请求,就是在后台线程发送请求,不在主线程发送请求。通常状况下,客户端发出请求后,须要等待服务器的数据返回,若是服务器处理速度比较慢或者网速慢的话,可能要等很长时间。所以,若是你执意要发送同步请求,也就是在主线程发送请求,会形成主线程阻塞,容易出现卡机现象,给用户带来极差的体验。
1 // 请求地址 2 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login?username=123&pwd=123"; 3 4 // 初始化一个NSURL对象 5 NSURL *url = [NSURL URLWithString:urlString]; 6 7 // 初始化一个请求 8 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 9 // 设置请求方法,能够省略,默认就是GET请求 10 request.HTTPMethod = @"GET"; 11 // 若是60秒事后服务器尚未相应,就算请求超时 12 request.timeoutInterval = 60; 13 14 // 初始化一个链接 15 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self]; 16 // 开始一个异步请求 17 [conn start];
1> 第2行的是请求地址,因为是GET请求,请求参数是直接拼接到路径后面的
2> 第17行调用NSURLConnection的start方法发送一个HTPP请求,默认就是异步请求
在前面的第15行代码中,初始化NSURLConnection对象的时候传了个self作代理(delegate),我这里的self是控制器。在客户端跟服务器交互过程会不断地给这个代理对象发送消息,也就是会不断地调用代理对象的相应方法。iOS在NSURLConnectionDataDelegate协议中定义了不少代理方法,我这里只介绍经常使用的3个方法:
1 #pragma mark - NSURLConnectionDataDelegate 2 #pragma mark 接收到服务器返回的数据时调用(若是数据比较多,这个方法可能会被调用屡次) 3 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 4 NSLog(@"接收到服务器返回的数据"); 5 // 拼接数据 6 [self.data appendData:data]; 7 } 8 9 #pragma mark 网络链接出错时调用 10 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 11 NSLog(@"网络链接出错:%@", [error localizedDescription]); 12 } 13 14 #pragma mark 服务器的数据已经接收完毕时调用 15 - (void)connectionDidFinishLoading:(NSURLConnection *)connection { 16 NSLog(@"服务器的数据已经接收完毕"); 17 // 解析成字符串数据 18 NSString *str = [[[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding] autorelease]; 19 NSLog(@"%@", str); 20 }
1> 当服务器有数据返回时就会调用第3行的代理方法,返回的数据以NSData的格式传入。若是数据比较多,好比下载大文件时,这个方法可能会被调用屡次。
2> 第6行用一个NSMutableData对象拼接服务器返回的全部数据,self.data是一个NSMutableData。
3> 当服务器已经成功返回全部的数据后,会调用第15行的代理方法,到此为止,self.data里面存放着服务器端返回的全部数据
4> 因为我这边服务器返回的是JSON字符串数据,因此在18行将self.data转换为NSString,而后打印出来看看数据对不对
若是你的请求参数中含有中文,必须先进行编码,而后再拼接到请求路径后面。
下面的请求路径写法是错误的:
1 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login?username=母鸡";
应该这样写:
1 // 使用UTF-8对中文参数进行编码 2 NSString *param = [@"母鸡" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 3 4 // 请求地址 5 NSString *baseUrl = @"http://192.168.1.102:8080/MJServer/login?username="; 6 NSString *urlString = [baseUrl stringByAppendingString:param];
1> 第2行使用UTF-8对中文参数进行编码
2> 在第6行拼接编码后的参数到请求路径中
若是用户的网络情况不是很好,那么在登陆的过程当中,用户极可能会点击"取消"按钮来取消登陆
当用户点击了取消按钮,咱们也应该终止以前发送的请求,这时候能够这样作
[conn cancel];
conn是一个NSURLConnection对象
原做者,M了个J