ios 苹果自带的get请求

一、API简介

如果你想在iOS中发送Http请求的话,有很多方式可以选择,我在这里介绍几个常见的:

1.苹果自带的API

1> Core Foundation框架中的CFNetwork API:纯C语言的API,性能非常高

2> Foundation框架中的NSURLConnection API:Objective-C的API,性能也不错,简单易用

2.第3方开源框架

1> ASIHttpRequest

2> AFNetworking

我们这个专题主要来研究NSURLConnection的使用,至于第3方框架的学习,网上也有很多资源可以搜索。

二、发送异步的GET请求

众所周知,HTTP的主要请求方式有2种:GET请求和POST请求,接下来先演示下如何发送一个GET请求。

需要注意的是,你最好发送一个异步请求,不要发送同步请求。iOS程序启动后,系统会默认创建一条主线程,也称为UI线程,这条主线程专门用来渲染UI界面、处理UI界面和用户之间的交互,比如处理用户的触摸事件、文本输入事件等。所谓异步请求,就是在后台线程发送请求,不在主线程发送请求。一般情况下,客户端发出请求后,需要等待服务器的数据返回,如果服务器处理速度比较慢或者网速慢的话,可能要等很长时间。因此,如果你执意要发送同步请求,也就是在主线程发送请求,会造成主线程阻塞,容易出现卡机现象,给用户带来极差的体验。

1.利用NSURLConnection发送异步请求

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请求,默认就是异步请求

2.NSURLConnectionDataDelegate

在前面的第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,然后打印出来看看数据对不对

3.对中文参数进行编码

如果你的请求参数中含有中文,必须先进行编码,然后再拼接到请求路径后面。

下面的请求路径写法是错误的:

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行拼接编码后的参数到请求路径中

4.取消请求

如果用户的网络状况不是很好,那么在登录的过程中,用户很可能会点击”取消”按钮来取消登录

17222504-fcc9635859f647e19c8ce4d78a1a3351.png

当用户点击了取消按钮,我们也应该终止之前发送的请求,这时候可以这样做

[conn cancel];conn是一个NSURLConnection对象

复制代码

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-20 03:15:45

ios 苹果自带的get请求的相关文章

iOS苹果自带UIMenuController

一.UIMenuController认识 1.默认情况下,UITextView / UITextFiled / UIWebView 都有苹果自带的有UIMenuController功能 2.UITextFiled 的弹出菜单效果系统自带的      3.当然,系统只给某些控件提供的该功能,但是我们自己给可以给指定控件添加该功能效果,至于如何添加,我们先简单学习一下,如何使用系统提供的UIMenuController功能 二.UIMenuController基本使用 如何学UIMenuContro

ios开发中如何调用苹果自带地图导航

前段时间一直在赶项目,在外包公司工作就是命苦,天天加班不说,工作都是和工期合同挂钩的,稍微逾期就有可能被扣奖金,不谈这些伤脑筋的事情了,让我们说说iOS开发中如何调用苹果手机自带的地图. 学习如逆水行舟,不进则退.古人告诉我们要不断的反思和总结,日思则日精,月思则月精,年思则年精.只有不断的尝试和总结,才能让我们的工作和生活更加轻松愉快和美好.连着做了两个大的商城外包项目,智慧城市,搜牧通,花费了近四个月的时间,终于在反复修改后完美收工.期间的困难自不必说,以后多多总结和沟通吧.百度地图的使用之

ios网络学习------1get post异步请求

网络请求的步骤: get请求: #pragma mark - 这是私有方法,尽量不要再方法中直接使用属性,因为一般来说属性都是和界面关联的,我们可以通过参数的方式来使用属性 #pragma mark Get登录方法 - (void)loginWithGet:(NSString *)name pwd:(NSString *)pwd { //1确定地址NSURL NSString *urlString = [NSString stringWithFormat:@"www.baidu.com?user

ios 苹果和百度地图的相关使用

iOS中使用较多的3款地图,google地图.百度地图.苹果自带地图(高德).其中苹果自带地图在中国使用的是高德的数据.苹果在iOS 6之后放弃了使用谷歌地图,而改用自家的地图.在国内使用的较多的就是百度.苹果自带地图(高德),以下总结下这两个. 一.苹果地图的使用 因为苹果使用的是高德的地图,加上苹果做的一些封装,使用起来也非常方便.不需要引入第三方框架,相比较之下,使用百度地图SDK会使源码与程序都 大10M多,这点很蛋疼.同时由于苹果使用的是高德,不会像谷歌地图一样在国内乌龟一样的访问速度

Thinkphp5新版聚合VIP影视APP源码 安卓/IOS苹果双端,非常棒的一款在线视频VIP解析

Thinkphp5新版聚合VIP影视APP源码 安卓/IOS苹果双端,非常棒的一款在线视频VIP解析APP,代理裂变版下载地址:Q1013175107这套系统,我是开发者,外面都是乐色,后门无数.不信可以找我测试,秒进后台.删库跑路最新更新日志用户注册可以去除短信注册或保留新用户点击观影区直接跳登录页(不会弹出会员已过期)增加了观看记录增加成10条解析,最新电影页可以在后台添加,美化直播大厅,美化会员中心,独家可以切换会员中心风格 本套源码特色一.此版本为原生双端APP:(安卓+苹果)二.后台支

APICloud打开三方地图整合(百度,高德,腾讯,苹果自带)

一直想系统的整理打开地图的方法,今天抽时间把了百度,高德,腾讯,苹果自带地图都整理出来了,闲话不多说,直接上干货 ----------------------------------------------------------------------code start---------------------------------------------------------------------------------------------------- <!DOCTYPE HT

IOS的一个带动画的多项选择的控件(二)

然后我们来写:TypeSelectView 这个比较简单,我们只要只要每个TypeView的位置,然后作为自己的subview就好了 @interface TypeSelectView : UIView @property(nonatomic) BOOL bShown; @property(nonatomic, strong) TypeView* curSelectedView; -(id)initWithFrame:(CGRect)frame searchType:(int)type; @en

iOS ASIHTTPRequest用https协议加密请求

iOS 终端请求服务端数据时,为了保证数据安全,我们一般会使用https协议加密,而对于iOS的网络编程,我们一般会使用开源框架:ASIHTTPRequest,但是如果使用传统的http方式,即使忽略验证的话,程序也会报[error-9844]的错误,具体错误如下描述: [Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0x6aafa30 {NSUnderlyi

IOS的一个带动画的多项选择的控件(一)

先上效果图: 这个程序分2个层次,一个是顶部的带UITextField的bar,一个是下拉选择的view,下拉选择的view带有4个自定义的UIView 我们先定义一个UIViewController叫MyViewController,然后顶部的bar叫TopBarView,下拉选择的view叫TypeSelectView,像UIButton的自定义的view叫做TypeView TypeView有两种状态,如果手指触摸到的item就是选中状态,所以TypeSelectView应该有个属性表示当