ios 苹果自带的get请求

原创 2015年07月07日 02:24:22

一、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对象
复制代码

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

iOS开发调用苹果自带的地图应用

iOS6.0以后我们可以在应用中直接调用苹果自带的地图应用了,并且可以实现搜索单个位置,查询线路。 难度不大,但是搜索的时候只能传过去经纬度坐标,因此很多时候就要把地理位置信息转换成经纬度坐标了,具...
  • u011678216
  • u011678216
  • 2014年03月27日 12:12
  • 2631

iOS 苹果自带地图需求开发——1

在iOS开发的过程中,不可避免的要涉及到地图方面的需求,本人也刚刚实现了一些地图上面的需求所以整理了以下的一些实现方式。 1.实现景点(地点)的定位功能 比较简单 话不多说上代码...
  • cuimingran
  • cuimingran
  • 2015年05月27日 22:38
  • 729

iOS7自带扫描二维码、条形码功能实现

随着二维码的普及,扫码功能越来越重要,比起手动输入,扫码直接获取的方式会更加的便捷和快速,在iOS7之前,实现扫码一般是使用第三方的类库,如ZBar等,iOS7之后开始自行提供扫码的框架,在AVFou...
  • Cloudox_
  • Cloudox_
  • 2015年09月14日 21:09
  • 2745

iOS项目开发实战——使用AFNetworking进行Http Get请求

只要是做开发,就一定会接触到网络请求。AFNetworking是目前为止,iOS开源代码中排名第一的库,从来没有停止过更。提供的人性化API可以为我们做网络相关开发节省很多时间。我先来使用AFNetw...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2015年09月16日 21:20
  • 4604

iOS-GET请求详细操作-GET设置请求头

难得一次备注相当详细的原生GET网络请求操作,强迫症一样记录下来和大家分享… 也备复制用-(void)getResult{ _MB = [MBProgressHUD showHUDAddedT...
  • qiuxuewei2012
  • qiuxuewei2012
  • 2016年03月04日 12:12
  • 5655

iOS 原生NSURLSession 简单的 GET、POST 请求

简单的使用iOS原生的NSURLSession 简单的封一个get,post 短数据网络请求,纯属个人意见,如有错误请指教。...
  • qq_33646395
  • qq_33646395
  • 2017年01月03日 13:40
  • 899

iOS社交分享(苹果自带)

那么今天来给同学们讲解社交分享的功能,以及第三方分享平台!那么废话不多说直接上代码! 1> 微信 - 国内唯一一款没有PC原型的软件 新浪微博 - 苹果在iOS6集成 腾讯微博 - 苹果在iOS7...
  • ZZ_IOSdeveloper
  • ZZ_IOSdeveloper
  • 2017年03月17日 17:40
  • 236

iOS - AFNetwork GET POST使用例子

目前网络上流传着一个ASI和AFN比较的一张表,先放在这里看一看 AFN最新版本是支持HTTP/2协议的,而ASI是不支持的。 综合一下,想研究一下AFN的使用方法。 对比 ASI AFN...
  • icefishlily
  • icefishlily
  • 2016年09月12日 15:11
  • 2458

iOS请求数据两种方式(GET、POST)

iOS中请求数据的方式有两种方式 GET、 POST POST: 地址栏中不会有表单请求的参数; 参数数量和长度没有限制 GET: 将表单请求中的参数拼接到地址中进行传递; 参数数量和长度...
  • u014305730
  • u014305730
  • 2016年02月21日 20:08
  • 4940

iOS webview get和post请求传值给链接的页面

iOS webview链接 get和post请求传值给链接的页面get请求
  • u010464084
  • u010464084
  • 2016年01月04日 08:56
  • 4883
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ios 苹果自带的get请求
举报原因:
原因补充:

(最多只允许输入30个字)