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:];
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[]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:];
[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[]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:];
_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[]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: timeoutInterval:];
//将請求參數轉化成NSData
NSString *bodyString = @"status=��&access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";
NSData *data = [bodyString dataUsingEncoding:];
//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: timeoutInterval:];
NSString *bodyString = @"status=��&access_token=2.00xSFqpCYTVpIB59d7f3a4de0NCrgJ";
NSData *data = [bodyString dataUsingEncoding:];
[mRequest setHTTPMethod:@"POST"];
[mRequest setHTTPBody:data];
_connectionPost = [NSURLConnection connectionWithRequest:mRequest delegate:self];
}
//協定遵循的辦法已經在上面寫出,此處不重複