?移動互聯網時代,網絡通信已是手機終端必不可少的功能。我們的應用中也必不可少的使用了網絡通信,增強客戶端與服務器交互。這一篇提供了使用NSURLConnection實現http通信的方式。
NSURLConnection提供了異步請求、同步請求兩種通信方式。
**1、異步請求**
iOS5.0 SDK NSURLConnection類新增的sendAsynchronousRequest:queue:completionHandler:方法,從而使iOS5支持兩種異步請求方式。我們先從新增類開始。
1)sendAsynchronousRequest
iOS5.0開始支持sendAsynchronousReques方法,方法使用如下:
~~~
- (void)httpAsynchronousRequest{
NSURL *url = [NSURL URLWithString:@"http://url"];
NSString *post=@"postData";
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:postData];
[request setTimeoutInterval:10.0];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[NSURLConnection sendAsynchronousRequest:request
queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
if (error) {
NSLog(@"Httperror:%@%d", error.localizedDescription,error.code);
}else{
NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"HttpResponseCode:%d", responseCode);
NSLog(@"HttpResponseBody %@",responseString);
}
}];
}
~~~
? ? ? sendAsynchronousReques可以很容易地使用NSURLRequest接收回調,完成http通信。
2)connectionWithRequest
iOS2.0就開始支持connectionWithRequest方法,使用如下:
~~~
- (void)httpConnectionWithRequest{
NSString *URLPath = [NSString stringWithFormat:@"http://url"];
NSURL *URL = [NSURL URLWithString:URLPath];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
[NSURLConnection connectionWithRequest:request delegate:self];
}
- (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response
{
NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
NSLog(@"response length=%lld statecode%d", [response expectedContentLength],responseCode);
}
// A delegate method called by the NSURLConnection as data arrives. The
// response data for a POST is only for useful for debugging purposes,
// so we just drop it on the floor.
- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data
{
if (mData == nil) {
mData = [[NSMutableData alloc] initWithData:data];
} else {
[mData appendData:data];
}
NSLog(@"response connection");
}
// A delegate method called by the NSURLConnection if the connection fails.
// We shut down the connection and display the failure. Production quality code
// would either display or log the actual error.
- (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error
{
NSLog(@"response error%@", [error localizedFailureReason]);
}
// A delegate method called by the NSURLConnection when the connection has been
// done successfully. We shut down the connection with a nil status, which
// causes the image to be displayed.
- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection
{
NSString *responseString = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];
NSLog(@"response body%@", responseString);
}
~~~
???connectionWithRequest需要delegate參數,通過一個delegate來做數據的下載以及Request的接受以及連接狀態,此處delegate:self,所以需要本類實現一些方法,并且定義mData做數據的接受。
需要實現的方法:
1、獲取返回狀態、包頭信息。
~~~
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
~~~
2、連接失敗,包含失敗。
~~~
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
~~~
3、接收數據
~~~
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
~~~
4、數據接收完畢
-(void)connectionDidFinishLoading:(NSURLConnection?*)connection;
connectionWithRequest使用起來比較繁瑣,而iOS5.0之前用不支持sendAsynchronousRequest。有網友提出了[AEURLConnection](https://github.com/adamjernst/AEURLConnection)解決方案。
~~~
AEURLConnection is a simple reimplementation of the API for use on iOS 4. Used properly, it is also guaranteed to be safe against The Deallocation Problem, a thorny threading issue that affects most other networking libraries.
~~~
**2、同步請求**
同步請求數據方法如下:
~~~
- (void)httpSynchronousRequest{
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&error];
if (error == nil)
{
// 處理數據
}
}
~~~
同步請求數據會造成主線程阻塞,通常在請求大數據或網絡不暢時不建議使用。
從上面的代碼可以看出,不管同步請求還是異步請求,建立通信的步驟基本是一樣的:
1、創建NSURL
2、創建Request對象
3、創建NSURLConnection連接。
NSURLConnection創建成功后,就創建了一個http連接。異步請求和同步請求的區別是:創建了異步請求,用戶可以做其他的操作,請求會在另一個線程執行,通信結果及過程會在回調函數中執行。同步請求則不同,需要請求結束用戶才能做其他的操作。
- 前言
- (一)——ios搭建開發環境
- (二)——Hello iOS
- (三)——iOS系統架構
- (四)——iOS應用程序生命周期
- (五)——UI基礎UIWindow、UIView
- (六)——ViewController
- (七)——UI基礎UIButton
- (八)——iOS網絡通信http之NSURLConnection
- (九)—— xml數據解析
- (十)——iOS真機調試
- (十一)——JSON數據解析
- (十二)——iOS國際化
- (十三)——獲取手機信息(UIDevice、NSBundle、NSLocale)
- (十四)——打電話、發短信
- (十五)——數據庫操作(SQLite)
- (十六)——數據庫操作(使用FMDB)
- (十七)——文件操作(NSFileManager)
- Swift初學習