**1.訪問網絡的方式**
**@同步請求:數據的請求在主線程來執行,一旦發送同步請求,程序將停止用戶交互,直至服務器返回數據完成,才可以進行下一步操作,而網絡數據加載需要一個時間過程,這樣的話就會堵塞主線程.**
**@異步請求:數據的請求過程在多線程執行**
**@其他區別:同步請求無法取消,異步請求過程中可以取消;同步請求無法監聽加載進度,異步可以監聽**
**2.主要請求方式:**
**@GET請求:將參數直接寫在訪問路徑上,操作簡單,但是容易被外界看到,安全性不高,而且有長度限制,地址最多255字節**
**@POST請求:將參數放到body里面.POST請求操作相對復雜,需要將參數和地址分開,不過安全性高,參數放在body里面不容易被捕獲**
**3.基本流程:**
**@構造NSURL實例(將需要請求的數據的網址字符串轉化成NSURL對象)**
@生成*NSURLRequest*請求(不可變,一般用*NSMutableURLRequest*)
**@通過NSURLConnection發送請求**
**@通過返回*NSURLResponse*實例和*NSError*實例分析結果**
**@接受返回數據**
**4.NSURL(**NSURL實例包裝了一個地址信息,可以是本地地址,也可以是遠程地址)
~~~
// 初始化URL實例
NSURL * url = [NSURL URLWithString:@"http://www.baidu.com:8080/search?id=1"];
// http
NSLog(@"Scheme:%@",[url scheme]);
// www.baidu.com
NSLog(@"Host:%@",[url host]);
// 端口8080
NSLog(@"Port:%@",[url port]);
// http://www.baidu.com:8080/search?id=1
NSLog(@"absoluteString:%@",[url absoluteString]);
// /search
NSLog(@"relativePath:%@",[url relativePath]);
// /search
NSLog(@"Path:%@",[url path]);
// ("/",search )
NSLog(@"pathComponents:%@",[url pathComponents]);
// id=1
NSLog(@"Query:%@",[url query]);
~~~
**5.NSURLRequest和NSMutableURLRequest**
~~~
@NSURLRequest 包裝了網絡請求的信息
NSURL * url = [NSURL URLWithString:urlString];
// 設置后不能改變
NSURLRequest * request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
@NSMutableURLRequest
@便利構造器方法(方便,其他參數另行設置)
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
// 請求方式默認是GET,可以不設置
[request setHTTPMethod:@"GET”];
@實例方法
NSMutableURLRequest * request = [[NSMutableURLRequest alloc]init];
// 設置超時時間
[request setTimeoutInterval:60.0];
// 設置請求參數(POST才有請求體,必設)
[request setHTTPBody:_data];
// 參數cachePolicy
NSURLRequest默認的cache policy是NSURLRequestUseProtocolCachePolicy, 是最能保持一致性的協議。
NSURLRequestReloadIgnoringCacheData 忽略緩存直接從原始地址下載
NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data時才從原始地址下載
NSURLRequestReturnCacheDataDontLoad 允許app確定是否要返回cache數據,如果使用這種協議當本地不存在response的時候,創建NSURLConnection or NSURLDownload實例時將會馬上返回nil;這類似于離線模式,沒有建立網絡連接;
~~~
**6.同步--->GET請求**
~~~
- (void)onClickBoysPostButton{
// 要求的地址
NSString * urlString = @"http://project.lanou3g.com/teacher/yihuiyun/phpXML.php?sex=男";
// 將地址編碼(把 sex=男 轉換成 sex=%E7%94%B7)
NSString *str = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 1.將網址字符串封裝為NSURL對象
NSURL * url = [NSURL URLWithString:str];
// 網絡請求設置
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
// 請求方式默認是GET
[request setHTTPMethod:@"GET"];
// 2.連接服務器
// Response對象,用來得到返回后的數據,比如,用statusCode==200 來判斷返回正常
NSHTTPURLResponse *response;
NSError * error = nil;
// 3. 返回數據
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
// NSData轉化NSString 用的是實例方法
NSString * string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
NSLog(@"%ld",[response statusCode]);
[string release];
}
~~~
**7.同步--->POST請求**
~~~
- (void)onClickPostButton{
//@第一步,創建URL
NSString * urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
NSURL * url = [NSURL URLWithString:urlString];
//@第二步,創建請求
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
// 設置請求方式POST,默認為GET
[request setHTTPMethod:@"POST"];
// 設置參數
NSString * parameterString = @"date=20131129&startRecord=2&len=20&udid=1234567890&terminalType=Iphone&cid=213";
NSData * postData = [parameterString dataUsingEncoding:NSUTF8StringEncoding];
// 客戶端向服務器提交數據,都是NSData類型,放在請求體里面
[request setHTTPBody:postData];
//@第三步,連接服務器
NSURLResponse * response = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
// NSData轉化NSString 用的是實例方法
NSString * string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
~~~
**8.異步(代理方法,可以監測過程)--->POST請求(這里只展示POST請求,GET請求類似)**
~~~
- (void)onClickPostButton{
//@第一步,創建URL
NSString * urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
NSURL * url = [NSURL URLWithString:urlString];
//@第二步,創建請求
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
// 設置請求方式POST,默認為GET
[request setHTTPMethod:@"POST"];
// 設置參數
NSString * parameterString = @"date=20131129&startRecord=2&len=20&udid=1234567890&terminalType=Iphone&cid=213";
NSData * postData = [parameterString dataUsingEncoding:NSUTF8StringEncoding];
// 客戶端向服務器提交數據,都是NSData類型,放在請求體里面
[request setHTTPBody:postData];
//@第三步,連接服務器(異步,同步太坑爹)
// 實現2個協議<NSURLConnectionDelegate,NSURLConnectionDataDelegate>
[NSURLConnection connectionWithRequest:request delegate:self];
}
// 服務器開始給客戶端回傳數據,這個方法只會執行一次
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
// 服務器開始回傳數據,客戶端需要創建一個空的,可變的Data對象,用于存儲每次獲取的數據片段
// @property (nonatomic,retain)NSMutableData * returnInfoData;
self.returnInfoData = [[NSMutableData alloc]init];
NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;
// 狀態碼
NSLog(@"%ld",httpResponse.statusCode);
// 響應報頭
NSLog(@"%@",httpResponse.allHeaderFields);
NSLOG_FUNCTION;
}
// 客戶端持續接收數據,data是數據片段,整個數據分段返回,這個方法執行的次數取決于數據總長度[response expectedContentLength]
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[_returnInfoData appendData:data];
NSLOG_FUNCTION;
}
// 數據完全下載成功,接收到完整數據
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
// _returnInfoData 是完整的數據了
[_returnInfoData release];
NSLOG_FUNCTION;
}
// 數據下載失敗
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"didFailWithError");
NSLOG_FUNCTION;
}
~~~
**9.異步(Blcok方法,不能監測過程)--->POST請求(這里只展示POST請求,GET請求類似)**
~~~
- (void)onClickAsyncBlockButton{
//@第一步,創建URL
NSString * urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
NSURL * url = [NSURL URLWithString:urlString];
//@第二步,創建請求
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
// 設置請求方式POST,默認為GET
[request setHTTPMethod:@"POST"];
// 設置參數
NSString * parameterString = @"date=20131129&startRecord=2&len=20&udid=1234567890&terminalType=Iphone&cid=213";
NSData * postData = [parameterString dataUsingEncoding:NSUTF8StringEncoding];
// 客戶端向服務器提交數據,都是NSData類型,放在請求體里面
[request setHTTPBody:postData];
//@第三步,連接服務器(異步,同步太坑爹)
// sendAsynchronousRequest 異步接受數據
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 數據已經接收完成,進行設置
}];
}
~~~
- 前言
- 沙盒機制與文件(一)
- 沙盒機制和文件(二)
- 沙盒機制和文件(三)
- NSBundle介紹以及讀取沙盒文件路徑問題
- 數據持久化(一)-----歸檔 讀寫 文件路徑
- 數據持久化(二)-----Sqlite
- 數據持久化(三)使用第三方類庫FMDB
- 數據持久化(四)之NSUserDefaults
- 數據持久化(五)之CoreData
- 數據持久化(六)之Using CoreData with MagicalRecord
- 數據解析(一)解析XML之系統自帶NSXMLParse類
- 數據解析(二)解析XML之GDataXMLNode
- 數據解析(三)解析JSON-----系統自帶NSJSONSerialization 與 第三方JSONKit
- iOS多線程編程(一)NSThread
- iOS多線程編程(二)NSOperationQueue
- iOS多線程編程(三)Grand Central Dispatch(GCD)詳解
- iOS網絡編程(一)NSURLConnection
- iOS網絡編程(二) 自定義請求網絡類----推薦用于需要請求過程片段數據
- iOS網絡編程(三) 異步加載及緩存圖片---->SDWebImage
- iOS網絡編程(四) 異步加載及緩存圖片-----自定義類
- iOS網絡編程(五) 異步加載及緩存圖片-----EGO
- iOS網絡編程(六) NSURLSession詳解
- iOS網絡編程(7) 第三方開源庫----->AFNetworking