NSURLConnection的常用类
NSURL:请求地址
NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体....
NSMutableURLRequest:NSURLRequest的子类
NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据
使用 NSURLConnection 分别实现同步get、异步get、同步post、异步post
首先我们新建一个工程,在UI界面加入一个text,四个button,如图所示:
我们以微博为例,实现接收微博,发送微博。
首先我们找到相关的API,进入新浪公共平台,如图所示:
实现同步get:
//在这之前我们创建一个WeiBoModel类,声明六个属性,分别与最外层字典的每一个元素对应,并声明一个initWithDictionary: 方法
@property (nonatomic,strong)NSArray *statuses;
@property (nonatomic,strong)NSNumber *hasvisible;
@property (nonatomic,strong)NSNumber *previous_cursor;
@property (nonatomic,strong)NSNumber *next_cursor;
@property (nonatomic,strong)NSNumber *total_number;
@property (nonatomic,strong)NSNumber *interval;
- (id)initWithDictionary:(NSDictionary *)dictionary;
- (IBAction)synchronizedGet:(UIButton *)sender {
NSString *urlstring = @"https://api.weibo.com/2/statuses/public_timeline.json?access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";
urlstring = [urlstring stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlstring];
//创建一个url请求,request
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
NSURLResponse *httpUrlResponse;
NSError *error;
//使用 NSURLConnection 类,和服务器连接,同步过程
NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:&httpUrlResponse error:&error];
//JSON数据格式解析,利用系统提供的API进行JSON数据的解析
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
WeiBoModel *model = [[WeiBoModel alloc] initWithDictionary:dictionary];
//逐层找出我们想要的信息,即第一条最新微博里面的text
NSString *text = [model.statuses[0]objectForKey:@"text"];
self.textView.text = text;
}
异步get:
- (IBAction)AsynchronizedGet:(UIButton *)sender {
NSString *urlstring = @"https://api.weibo.com/2/statuses/public_timeline.json?access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";
urlstring = [urlstring stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlstring];
//创建一个url请求,request
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; *model = [[WeiBoModel alloc]initWithDictionary:dictionary];
NSString *text = [model.statuses[0]objectForKey:@"text"];
dispatch_async(dispatch_get_main_queue(), ^{
self.textView.text = text;
});
}];
}
实现异步get还有另外一个方法,即使用代理:
- (IBAction)AsynchronizedGet:(UIButton *)sender {
NSString *urlstring = @"https://api.weibo.com/2/statuses/public_timeline.json?access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";
urlstring = [urlstring stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlstring];
//创建一个url请求,request
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
_connectionGet = [NSURLConnection connectionWithRequest:request delegate:self];
}
//因为异步get与与等一下要讲的异步post遵循同一个协议,所以我们必须对不同情况进行区分,我们声明四个全局变量,其中data用于接收数据,connection用于判断
{
NSMutableData *_mDataGet;
NSMutableData *_mDataPost;
NSURLConnection *_connectionGet;
NSURLConnection *_connectionPost;
}
使用代理来实现异步get,需要遵循 NSURLConnectionDataDelegate 协议,并重写三个方法,如下所示:
//服务器开始响应,准备向客户发送数据
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSLog(@"服务器开始响应,准备向客户发送数据");
if (connection == _connectionGet) {
_mDataGet = [NSMutableData data];
}
//此处为异步post相关处理
if (connection == _connectionPost) {
_mDataPost = [NSMutableData data];
}
}
//从服务器接收到数据,并且此方法会执行多次
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
NSLog(@"从服务器接收到数据,并且此方法会执行多次");
if (connection == _connectionGet) {
[_mDataGet appendData:data];
}
//此处为异步post相关处理
if (connection == _connectionPost) {
[_mDataPost appendData:data];
}
}
//接受数据完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSLog(@"接受数据完成");
if (connection == _connectionGet) {
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:_mDataGet
options:NSJSONReadingAllowFragments
error:nil];
WeiBoModel *model = [[WeiBoModel alloc]initWithDictionary:dictionary];
NSString *text = [model.statuses[0]objectForKey:@"text"];
//更新UI需要回到主线程
//self.textView.text = text;
//回到主线程的两种方式
[self.textView performSelectorOnMainThread:@selector(setText:)
withObject:text
waitUntilDone:NO];
dispatch_async(dispatch_get_main_queue(), ^{
self.textView.text = text;
});
}
//此处为异步post相关处理
if (connection == _connectionPost) {
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:_mDataPost
options:NSJSONReadingAllowFragments
error:nil];
}
}
同步post
- (IBAction)synchronizePost:(UIButton *)sender {
NSString *urlString = @"https://api.weibo.com/2/statuses/update.json";
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:60];
//将请求参数转化成NSData
NSString *bodyString = @"status=��&access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";
NSData *data = [bodyString dataUsingEncoding:4];
//post 设置它的方法体
[mRequest setHTTPMethod:@"POST"];
[mRequest setHTTPBody:data];
NSData *resultData = [NSURLConnection sendSynchronousRequest:mRequest returningResponse:nil error:nil];
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:resultData options:NSJSONReadingAllowFragments error:nil];
}
异步post
- (IBAction)AsynchronizePost:(UIButton *)sender {
NSString *urlString = @"https://api.weibo.com/2/statuses/update.json";
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:60];
NSString *bodyString = @"status=��&access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";
NSData *data = [bodyString dataUsingEncoding:4];
[mRequest setHTTPMethod:@"POST"];
[mRequest setHTTPBody:data];
_connectionPost = [NSURLConnection connectionWithRequest:mRequest delegate:self];
}
//协议遵循的办法已经在上面写出,此处不重复