iOS上的http请求:getpost以及同步异步
Posted jhcelue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS上的http请求:getpost以及同步异步相关的知识,希望对你有一定的参考价值。
1、get:
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>
用字符串构建NSURL,最好在使用URLWithString的时候把原字符串进行一下UTF8转码。关于为何要转码。看下这里第一部分。然后NSURL对象构建NSURLRequest。使用NSURLConnection的同步方法。传入request对象就能够通过get方法获取数据。
这里有个NSError对象地址传入,用于做错误推断。网络的实际情况是多变的。必需要考虑请求错误的情况。否则可能导致程序奔溃。
2、post:
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.
}
3、同步和异步请求:
一般网络请求都须要一段时间,哪怕数据再少、网络再好。都会有一段时间,并且非常多时候必须考虑在网络不好的时候的app状态。
使用同步请求仅仅需安心等待数据就能够。不须要做额外操作,上面两例都是同步请求。connection调用方法后会把返回请求的数据,无需做什么其它事。可是同步会堵塞线程,假设通过点击button来发起请求,那么按钮会停留在highLight状态直到请求结束,会造成一种app卡住、死机的感觉,非常不好。
异步get:
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
)
协议方法:
要注意的是这里有两个托付:NSURLConnectionDataDelegate和NSURLConnectionDelegate,前一个继承于后一个。获取数据的方法是定义在前一个托付里面的。所以仅仅要遵循NSURLConnectionDataDelegate就能够了。
一般用到四个托付方法:
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.
}
1.
1.
1.
1.
NSURLRequest
* request = [[NSURLRequest alloc]initWithURL:URL cachePolicy:
0
timeoutInterval:
8.0
];</span>
1.
NSMutableURLRequest
* request = [[NSMutableURLRequest alloc]initWithURL:URL];
2.
[request
setTimeoutInterval:
8.0
];
1.
-(
void
)connection:(NSURLConnection
*)connection didFailWithError:(NSError *)error
以上是关于iOS上的http请求:getpost以及同步异步的主要内容,如果未能解决你的问题,请参考以下文章