iOS上的http请求:get、post以及同步、异步

1、get:

view
source
print?

01.<span
style=
"font-size:14px;">NSString
* URLString = @
"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=广东";

02.NSURL
* URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

03.

04.NSURLRequest
* request = [[NSURLRequest alloc]initWithURL:URL];

05.NSURLResponse
* response = nil;

06.NSError
* error = nil;

07.NSData
* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

08.if (error)
{

09.NSLog(@"error:
%@"
,[error
localizedDescription]);

10.}else{

11.NSLog(@"response
: %@"
,response);

12.NSLog(@"backData
: %@"
,[[NSString
alloc]initWithData:data encoding:NSUTF8StringEncoding]);

13.}

14.</span>

get方法的请求参数是放在长长的URL字符串里面,这里只需要一个参数,就是地区的编号或名字,通过这个参数,服务器返回属于这个区域内支持天气查找的城市列表。如果有更多的参数也是放在URL字符串里面,至于参数的组织方式,就看服务器的要求了。

用字符串构建NSURL,最好在使用URLWithString的时候把原字符串进行一下UTF8转码,关于为何要转码,看下这里第一部分。然后NSURL对象构建NSURLRequest,使用NSURLConnection的同步方法,传入request对象就可以通过get方法获取数据。

这里有个NSError对象地址传入,用于做错误判断,网络的实际情况是多变的,必须要考虑请求错误的情况,否则可能导致程序奔溃。

2、post:

view
source
print?

01.NSString
* URLString = @
"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityString";

02.NSURL
* URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

03.

04.NSString
* postString = @
"theRegionCode=广东";

05.NSData
* postData = [postString dataUsingEncoding:NSUTF8StringEncoding];  
//将请求参数字符串转成NSData类型

06.

07.NSMutableURLRequest
* request = [[NSMutableURLRequest alloc]init];

08.[request
setHTTPMethod:@
"post"]; //指定请求方式

09.[request
setURL:URL]; 
//设置请求的地址

10.[request
setHTTPBody:postData];  
//设置请求的参数

11.

12.NSURLResponse
* response;

13.NSError
* error;

14.NSData
* backData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

15.

16.if (error)
{

17.NSLog(@"error
: %@"
,[error
localizedDescription]);

18.}else{

19.NSLog(@"response
: %@"
,response);

20.NSLog(@"backData
: %@"
,[[NSString
alloc]initWithData:backData encoding:NSUTF8StringEncoding]);

21.}

post方式的时候参数是放在HTTPBody里面的,而且需要将字符串转码成响应的NSData类型,在接口文档里一般都有指出转码方式,需要按指定方式转码,这里的UTF8,也有gb2312的。request构建好了之后,和get方法一样使用NSURLConnection请求数据。

3、同步和异步请求:

一般网络请求都需要一段时间,哪怕数据再少、网络再好,都会有一段时间,而且很多时候必须考虑在网络不好的时候的app状态。使用同步请求只需安心等待数据就可以,不需要做额外操作,上面两例都是同步请求,connection调用方法后会把返回请求的数据,无需做什么其他事。但是同步会阻塞线程,如果通过点击button来发起请求,那么按钮会停留在highLight状态直到请求结束,会造成一种app卡住、死机的感觉,很不好。

异步get:

view
source
print?

1.NSString
* URLString = @
"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=广东";

2.NSURL
* URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

3.

4.NSURLRequest
* request = [[NSURLRequest alloc]initWithURL:URL];

5.

6._connection
= [[NSURLConnection alloc]initWithRequest:request delegate:self];  (
1)

异步post类似,不再是使用NSURLConnection调用方法直接得到数据,而是使用(1)位置方法构建一个NSURLConnection对象,这个方法会默认开始请求数据。接下来关键就是靠委托了。因为请求的时间未知,所以使用委托模式的回调作用,在数据回来是调用协议方法。post和get委托方法处理一样。

协议方法:

要注意的是这里有两个委托:NSURLConnectionDataDelegate和NSURLConnectionDelegate,前一个继承于后一个,获取数据的方法是定义在前一个委托里面的,所以只要遵循NSURLConnectionDataDelegate就可以了。

一般用到四个委托方法:

view
source
print?

01.<pre
name=
"code" class="objc">//接受到respone,这里面包含了HTTP请求状态码和数据头信息,包括数据长度、编码格式等

02.-(void)connection:(NSURLConnection
*)connection didReceiveResponse:(NSURLResponse *)response{ NSLog(@
"response
= %@"
,response);
_backData = [[NSMutableData alloc]init];

03.}

04.

05.//接受到数据时调用,完整的数据可能拆分为多个包发送,每次接受到数据片段都会调用这个方法,所以需要一个全局的NSData对象,用来把每次的数据拼接在一起

06.-(void)connection:(NSURLConnection
*)connection didReceiveData:(NSData *)data{

07.[_backData
appendData:data];

08.}

09.

10.//数据接受结束时调用这个方法,这时的数据就是获得的完整数据了,可以使用数据做之后的处理了

11.-(void)connectionDidFinishLoading:(NSURLConnection
*)connection{

12.NSLog(@"%@",[[NSString
alloc]initWithData:_backData encoding:NSUTF8StringEncoding]);

13.}

14.

15.//这是请求出错是调用,错误处理不可忽视

16.-(void)connection:(NSURLConnection
*)connection didFailWithError:(NSError *)error{

17.if (error.code
== NSURLErrorTimedOut) {

18.NSLog(@"请求超时");

19.}

20.NSLog(@"%@",[error
localizedDescription]);

21.}

view
source
print?

1.

view
source
print?

1.

view
source
print?

1.

最后,请求可以设置超时时间:

view
source
print?

1.NSURLRequest
* request = [[NSURLRequest alloc]initWithURL:URL cachePolicy:
0 timeoutInterval:8.0];</span>

或者:

view
source
print?

1.NSMutableURLRequest
* request = [[NSMutableURLRequest alloc]initWithURL:URL];

2.[request
setTimeoutInterval:
8.0];

请求时间超过所设置的超时时间,会自动调用

view
source
print?

1.-(void)connection:(NSURLConnection
*)connection didFailWithError:(NSError *)error

但是有个问题是怎么把判断是超时导致的请求失败,上面的例子里已经写了,可以根据返回的error的code进行判断。了解不同情况的请求失败,可以更好的给用户提示。

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

时间: 2024-08-27 19:20:04

iOS上的http请求:get、post以及同步、异步的相关文章

iOS上的http请求:post方法

1 NSString * URLString = @"www.baidu.com"; 2 NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingE ncoding:NSUTF8StringEncoding]]; 4 NSString * postString = @"theRegionCode=湖南"; 5 NSData * postData = [postStr

iOS 上的 WebSocket 框架 Starscream

原文:WebSockets on iOS with Starscream 作者:Aaron Douglas 译者:kmyhy 传统的网络技术 (也就是 Berkeley sockets) 被认为是可靠和稳定的.但是 Berkeley socket 在某些 web 技术,比如代理和防火墙下不太好使.WebSocket 出现于 2011 年,是一种在客户端和服务端之间建立双向通讯的新技术.WebSocket 比起多个 HTTP 请求来说更有效率并允许长连接. 在 iOS 上使用 WebSocket

ios中封装网络请求类

ios中封装网络请求类 #import "JSNetWork.h" //asiHttpRequest #import "ASIFormDataRequest.h" //xml 的解析 #import "UseXmlParser.h" //判断是否联网 #import "Reachability.h" //sbJson,判断json的解析 #import "JSON.h" @implementation JS

如何保持iOS上键盘出现时输入框不被覆盖

在 iOS5 上请求显示键盘时,系统从屏幕底部将键盘滑入上来,位于应用的内容之上. (墙内:http://mikixiyou.iteye.com/blog/1488302) 如果屏幕中的内容项目比较多,它就可能覆盖住文本输入框之类的对象.你必须调整你的内容,使得输入框保持可见. 你会想到哪些处理方法呢? 第一种, 临时调整窗口中各个视图的大小,使得键盘从下向上占领的区域空白.键盘的高度( keyboard.size.height )是一定的,将视图中所有内容所在区域的 y 值减小到 y-keyb

前端开发在IOS上元素active状态无法触发问题

###需求: 按钮在点击时变色,给用户反馈: 手指离开屏幕后按钮颜色变回之前的颜色: ###问题: 使用css  active状态来实现上述需求:发现在浏览器和Android手机上效果都ok.但是IOS上死活不行.后来偶然发现一篇博文:http://blog.csdn.net/freshlover/article/details/43735273 解释了这个问题(感谢google).意思就是,如果你的body元素没有绑定'touchstart'事件,safari就不会使用active状态. ##

IOS NSURLRequest(http请求)讲解 ---------赎罪之路

前言 很久没有写过博客了,今天终于可以抽空写.公司的项目从2016年03月15日(我第二份工作任职)开始,辛苦了3个多月终于接近尾声了,在这当中我学了非常多东西,为了遗忘我就写个博客来记录下,以防止忘记. 正文 今天要讲的主角是NSURLRequest.这里我先采用apple 官方文档解释 NSURLRequest objects represent a URL load request in a manner independent of protocol and URL scheme, NS

深度学习之在iOS上运行CNN

1 引言 作为曾经的iOS开发者,在研究深度学习的时候,总有一个想法就是在iPhone上运行深度学习,不管是在手机上训练还是利用训练好的数据进行测试. 因为iOS的开发环境支持C++,因此,只要你的代码是C/C++,本质上就可以在iOS上运行. 怎么才能更快更好地在iOS上运行CNN呢? 2 方法1:通过Matlab转码 Matlab自带转成c的工具,如果你研究过UFLDL的深度学习教程,就知道如何在Matlab上使用CNN,那么,转换成c后,放到iOS的开发环境中,然后将参数存成txt格式再读

[ 面试没回答上的问题2]IOS上给body绑定click事件的bug

面试被问到ios上的bug,自己提到绑定click事件的bug,但是并没有把问题讲的很清楚,这里再清理一下思路. 这个bug只在IOS上有,包括ihone,ipad,由于ios浏览器都用的safari内核,所以ios浏览器全部中枪. bug描述 在进行事件委托时,如果将未存在于DOM的元素事件直接委托到body上的话,会导致事件委托失效,调试结果为事件响应到body子元素为止,既没有冒泡到body上,也没有被body所捕获.但如果事件是DOM元素本身具有的,则不会触发bug.换而言之,只有元素的

iOS上绘制自然的签名-b

这里有一篇很棒的文章写如何在Android上获取流畅的签名:Smoother Signatures:https://corner.squareup.com/2012/07/smoother-signatures.html,但是我没有找到一篇是写在iOS上如何实现.那么,究竟怎么做才能在iOS设备上获取用户的签名呢? 虽然我没有找到任何关于获取签名的文章,但是在App store上已经有了实现得很好的app.  Paper by 53:http://www.fiftythree.com/paper