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

iOS 网络之NSURLConnection

2015-12-05 19:03 549 查看
<
bddf
p>从网络获取数据

一.请求方法介绍

1.同步请求方法:

+ (NSData )sendSynchronousRequest:(NSURLRequest )request returningResponse:(NSURLResponse * )response error:(NSError **)error;

2.异步请求方法:

+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate ;

//此方法于上一个方法基本相同,只是该方法是实例方法

- (instancetype)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;

//此方法与上一方法相同只不过多了一个startImmediately参数,该参数控制是否立即发送请求

- (instancetype)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;

//该方法需要指定NSOperationQueue参数,表明将请求交给指定的NSOperationQueue处理

+ (void)sendAsynchronousRequest:(NSURLRequest*) request

queue:(NSOperationQueue*) queue

completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;

//开始发送请求,只有当通过- (instancetype)initWithRequest: delegate: startImmediately:方法发送请求,且最后一个参数为no时,才需调用该方法

- (void)start;

二.请求实例

此处将用NSURLRequest和NSMutableURLRequest分别请求网络,前者只可向服务器发出简单的请求,不可以添加请求头以及请求参数,而后者则不同

NSURLRequest:

部分代码:

- (void)viewDidLoad
{
[super viewDidLoad];
NSString* str = @"http://xxxxxxxxxxxxxxx";
totalData = [[NSMutableData alloc] init];
// 以指定NSString创建NSURL对象
NSURL* url = [NSURL URLWithString:str];
// 创建NSURLRequest对象
//  NSURLRequest* request = [NSURLRequest requestWithURL:url];
// 通过这种方式创建的NSURLRequest可以指定缓存策略、超时时长
NSURLRequest* request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5];
// 以指定URL、delegate创建连接、发送请求
NSURLConnection* conn = [NSURLConnection connectionWithRequest:request
delegate:self];
// 如果conn为nil,直接返回
if(conn != nil)
{
return;
}
}
// 当服务器系响应生成时激发该方法。
-(void)connection:(NSURLConnection *)connection
didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"--didReceiveResponse--");
NSLog(@"响应的数据类型:%@" , response.MIMEType);
// 获取响应数据的长度,如果不能检测到长度,返回NSURLResponseUnknownLength(-1)
NSLog(@"响应的数据长度为:%lld"
, response.expectedContentLength);
NSLog(@"响应的数据所使用的字符集:%@" , response.textEncodingName);
NSLog(@"响应的文件名:%@" , response.suggestedFilename);
}
// 每次读取服务器响应的数据时,都会激发该方法。
// 对于一个请求而言,服务器数据可能要分几次才能读取,因此该方法将会被触发多次。
// 如果程序需要将这些数据转换成字符串,建议使用NSMutableData来收集这些数据、然后整体转换
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData* )data
{
[totalData appendData:data];
}
// 当连接服务器出现错误时激发该方法。可通过error获取错误信息
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"-error--");
}
// 当数据load完成时激发该方法,对于每次请求,该方法只会被激发一次。
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString* content = [[NSString alloc] initWithData:totalData
encoding:NSUTF8StringEncoding];
NSLog(@"%@",content);
}


NSMutableURLRequest:

常用方法:

//该方法用于NSMutableURLRequest:添加请求头

-addValue:forHTTPHeaderField:

//该方法通过NSDictionary一次性为NSMutableURLRequest:设置多个请求头

setAllHTTPHeaderFields:

//设置请求参数

setHTTPBody:

//以NSInputStream为参数设置请求参数,该方法和上一方法只能设置一个

setHTTPBodyStream:

//设置请求方式:GET/POST

setHTTPMethod:

//设置http请求是否处理cookies

setHTTPShouldHandleCookies:

//为指定的请求头设置请求值

setValue: forHTTPHeaderField:

部分代码:

NSMutableData* totalData;
- (void)viewDidLoad
{
[super viewDidLoad];
NSString* str = @"xxxxxxxxxxxxxxxxx";
totalData = [[NSMutableData alloc] init];
// 以指定NSString创建NSURL对象
NSURL* url = [NSURL URLWithString:str];
// 创建NSURLRequest对象
// 通过这种方式创建的NSURLRequest可以指定缓存策略、超时时长
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:5];

// 准备请求参数
NSString* post = [NSString stringWithFormat:@"name=%@&pass=%@"
,@"YJ" , @"IOS"];
// 将请求参数转换为NSData
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
// 设置请求的方式,默认发送GET请求。
[request setHTTPMethod:@"POST"];
// 添加2个请求头
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"xxxxx"
forHTTPHeaderField:@"Content-Type"];
// 将请求数据设置为HTTP请求体
[request setHTTPBody:postData];
// 以指定URL、delegate创建连接、发送请求
NSURLConnection* conn = [NSURLConnection connectionWithRequest:request
delegate:self];
// 如果conn为nil,直接返回
if(conn != nil)
{
return;
}
}
// 当服务器系响应生成时激发该方法。
-(void)connection:(NSURLConnection *)connection
didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"--didReceiveResponse--");
NSLog(@"响应的数据类型:%@" , response.MIMEType);
// 获取响应数据的长度,如果不能检测到长度,返回NSURLResponseUnknownLength(-1)
NSLog(@"响应的数据长度为:%lld"
, response.expectedContentLength);
NSLog(@"响应的数据所使用的字符集:%@" , response.textEncodingName);
NSLog(@"响应的文件名:%@" , response.suggestedFilename);
}
// 每次读取服务器响应的数据时,都会激发该方法。
// 对于一个请求而言,服务器数据可能要分几次才能读取,因此该方法将会被触发多次。
// 如果程序需要将这些数据转换成字符串,建议使用NSMutableData来收集这些数据、然后整体转换
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData* )data
{
[totalData appendData:data];
}
// 当连接服务器出现错误时激发该方法。可通过error获取错误信息
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"-error--");
}
// 当数据load完成时激发该方法,对于每次请求,该方法只会被激发一次。
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{

NSString* content = [[NSString alloc] initWithData:totalData
encoding:NSUTF8StringEncoding];
NSLog(@"%@",content);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios-网络