您的位置:首页 > 理论基础 > 计算机网络

IOS开发之NSURL网络请求,同步异步,GET,POST

2013-08-01 16:32 926 查看
同步请求与异步请求的区别:

(1)同步请求下载会阻塞线程,会使用户失去与UI的交互,出现程序卡死现象。异步请求下载不会阻塞主线程,而会建立一个新的线程来做操作。

(2)异步请求的操作步骤与同步有差别,需要网络连接代理方法来实现。需要加协议:NSURLConnectionDataDelegate,NSURLConnectionDelegata

(一)同步GET请求

-(void)startsyncGetRequest
{
//1.创建URL。
NSURL *url = [NSURL URLWithString:@"http://api.tudou.com/v3/gw?method=item.ranking&appKey=72321d5b9ba5a8d0&format=json&pageNo=1&pageSize=10&channelId=30&inDays=30&sort=c"];

//2.通过URL创建NSURLRequest---cachePolicy:缓存协议;timeoutInterval:网络请求超时时间
NSURLRequest *request = [NSURLRequest requestWithURL:urlcachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];

NSURLResponse *response = nil;//3.用于接受服务器返回的响应

NSError *error = nil;//4.用于接受网络访问过程中出现的错误

//5.建立网络连接NSURLConnection,同步请求数据--(receivedData中保存的就是网络下载的数据,接下来只需要数据解析就行)
NSData *receivedData = [NSURLConnection sendSynchronousRequest:requestreturningResponse:&response error:&error];
}
(二)异步GET请求

-(void)startAsyncGETRequest
{
//1.创建url.
NSURL *url = [NSURL URLWithString:@"http://api.tudou.com/v3/gw?method=item.ranking&appKey=72321d5b9ba5a8d0&format=json&pageNo=1&pageSize=10&channelId=30&inDays=30&sort=c"];
//2.创建request.
NSURLRequest *request = [NSURLRequest requestWithURL:urlcachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];
//3.建立网络连接,异步的response在专门的代理方法里实现。
[NSURLConnection connectionWithRequest:request delegate:self];

}


异步加载数据的几个代理方法--用来接收数据。4.5.6步是必须得实现的

//4. 接收服务器反应--接收到服务器回应的时候此方法会被调用
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
_receiveData = [[NSMutableData alloc] init];
NSHTTPURLResponse *responses = (NSHTTPURLResponse*)response;
NSLog(@"%d",[responses statusCode]);
}

//5.接收服务器数据--接收到服务器传输数据的时候调用,按数据大小执行若干次
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[_receiveData appendData:data];
}
//6.显示数据--数据传输完之后调用,得到最终的receiveData
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *requestInfo = [[NSString alloc] initWithData:_receiveDataencoding:NSUTF8StringEncoding];
NSLog(@"%@",requestInfo);
}
//7.网络请求过程中,出现错误的时候会调用(断网,连接超时)
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%@",[error localizedDescription]);
}


注:

(1)GET请求:将参数直接写在了访问路径上;如:http://api.tudou.com/v3/gw?method=item.ranking&appKey=72321d5b9ba5a8d0&format=json&pageNo=1&pageSize=10&channelId=30&inDays=30&sort=c,参数容易被外界看到,安全性不高。

POST请求:将参数放到body里面;如:http://api.tudou.com/v3/gw?(?之后的就是参数),外界看不到参数,安全性比较高

(2)POST创建的NSURL是不带参数的,需要将请求的参数放入Boby中,所以得用NSMutableURLRequest来创建请求。

(三)异步POST请求

-(void)startAsyncPOSTRequest
{
NSURL *url = [NSURL URLWithString:@"http://api.tudou.com/v3/gw?"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlcachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];
//3.设置request是GET请求还是POST请求,默认是GET请求。
[request setHTTPMethod:@"POST"];。
( 注:下面三句表示:将参数转为NSData类型,放入request的Boby中---)
//4.参数转为nsstring型。
NSString *arguments = [NSStringstringWithFormat:@"method=item.ranking&appKey=72321d5b9ba5a8d0&format=json&pageNo=1&pageSize=10&channelId=30&inDays=30&sort=c"];
//5.将string型参数转为NSData型。
NSData *data = [arguments dataUsingEncoding:NSUTF8StringEncoding];
//6.设置request的Body为data。
[request setHTTPBody:data];
//7.根据request请求建立网络连接。
[NSURLConnection connectionWithRequest:request delegate:self];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: