URL全稱是Uniform Resource Locator(統一資源定位符)經過1個URL,能找到互聯網上惟一的1個資源mysql
URL就是資源的地址、位置,互聯網上的每一個資源都有一個惟一的URL程序員
URL的基本格式=協議://主機地址/路徑sql
http://www.cnblogs.com/gfxxbk/編程
協議:不一樣的協議,表明着不一樣的資源查找方式,資源傳輸方式瀏覽器
主機地址:存放資源的主機的IP地址(域名) 緩存
路徑:資源在主機中的位置安全
HTTP協議,Hyper Text Transfer Protocol(超文本傳輸協議)是用於從萬維網(WWW)服務器傳送超文本到本地瀏覽器的傳輸協議,HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。服務器
HTTP 協議採用請求/響應模型。客戶端向服務器發送一個請求報文,服務器以一個狀態做爲響應。網絡
Client和Server經常分別處在相距很遠的兩臺計算機上,Client程序的任務是將用戶的要求提交給Server程序,再將Server程序返回的結果以特定的形式顯示給用戶;Server程序的任務是接收客戶程序提出的服務請求,進行相應的處理,再將結果返回給客戶程序session
HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協議 它是一個安全通訊通道,它基於HTTP開發,用於在客戶計算機和服務器之間交換信息。 它使用安全套接字層(SSL)進行信息交換,簡單來講它是HTTP的安全版。 HTTPS協議使用SSL在發送方把原始數據進行加密,而後在接收方進行解密,加密和解密須要發送方和接受方經過交換共知的密鑰來實現,所以,所傳送的數據不容易被網絡黑客截獲和解密。
SSL是Netscape公司所提出的安全保密協議,在瀏覽器(如Internet Explorer、Netscape Navigator)和Web服務器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之間構造安全通道來進行數據傳輸,SSL運行在TCP/IP層之上、應用層之下,爲應用程序提供加密數據通道,
https協議須要到ca申請證書,通常免費證書不多,須要交費。
http是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的ssl加密傳輸協議
http和https使用的是徹底不一樣的連接方式,用的端口也不同,前者是80,後者是443.
http的連接很簡單,是無狀態的.
1> 請求方式
GET
POST
2> 兩種請求方式的比較
GET:經過網址字符串
POST:經過data
GET:網址字符串最多255字節
POST:使用NSData,容量超過1G
GET:全部傳輸給服務的數據,顯示在網址裏,相似於密碼的明文輸入,直接可見
POST:數據被轉成NSData(二進制數據),相似於密碼的密文輸入,沒法直接讀取
網絡請求地址對象NSURL的做用及用法
網絡請求對象NSURLRequest,NSMutableURLRequest的做用及用法
網絡連接對象NSURLConnection的做用及用法
網絡連接協議NSURLConnectionDelegate的做用及用法
url:統一資源定位符,也被稱爲網址,因特網上標準的資源網址
一個典型的url:http://lily:123456@www.google.com/search?hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page
url的符語法: 協議://受權/路徑?查詢
協議: ftp://(文件傳輸協議) http://(超文本傳輸協議)
https://(安全超文本傳輸協議) file://(本地文件協議)
同步鏈接:程序容易出現卡死現象
異步鏈接:等待數據返回
異步鏈接有兩種實現方式:
① 設置代理,接收數據
② 實現block
使用http請求 :NSAppTransportSecurity 字典 ,NSAllowsArbitraryLoads YES
代碼:
1 <key>NSAppTransportSecurity</key> 2 <dict> 3 <key>NSAllowsArbitraryLoads</key> 4 <true/> 5 </dict>
圖表:
① GET同步
1 - (IBAction)getSynchronousRequest:(UIButton *)sender 2 { 3 // 1. 建立URL 4 // GET_URL 是一個get網絡傳值的域名 5 NSURL *url = [NSURL URLWithString:GET_URL]; 6 7 // 2. 根據URL建立具體請求(使用緩存策略) 8 // 第一個參數:URL(統一資源定位符) 9 // 第二個參數:緩存策略(枚舉值) 10 /* 11 NSURLRequestUseProtocolCachePolicy = 0 基礎緩存策略 12 13 NSURLRequestReloadIgnoringLocalCacheData = 1 忽略本地的緩存,全部的數據都從網絡獲取 14 15 NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4 若是本地有緩存且有效就從本地獲取,不然從原地址下載 16 17 NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 優先使用本地緩存,若是沒有本地緩存就從網絡加載 18 19 NSURLRequestReturnCacheDataElseLoad = 2 使用本地緩存,從不下載,若是本地沒有緩存,則請求失敗,此策略多用於離線操做 20 21 NSURLRequestReturnCacheDataDontLoad = 3 無視任何緩存策略,不管是本地的仍是遠程的,老是從原地址從新下載 22 23 NSURLRequestReloadRevalidatingCacheData = 5 若是本地緩存是有效的則不下載,其餘任何狀況都從原地址從新下載 24 25 */ 26 // 第三個參數:設置延遲時間,若是超時,請求終止,單位爲秒(s) 27 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20]; 28 29 // 3. 鏈接服務器【NSURLConnection在iOS9以後被棄用,在之後的開發中不多見】 30 // 參數1:請求對象 31 // 參數2:存儲一些網絡請求的信息(通常爲包體),通常爲nil 32 // 參數3:錯誤信息 33 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 34 35 // 4. 進行JSON數據解析 36 NSDictionary *resultDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 37 38 NSLog(@"%@", resultDict); 39 40 // 解析數據本身寫 41 }
② POST同步
1 #pragma mark - 同步的post請求 2 - (IBAction)postSynchronousRequest:(UIButton *)sender 3 { 4 // 1. 建立URL 5 NSURL *url = [NSURL URLWithString:POST_URL]; 6 7 // 2. 設置網絡請求[post請求必須初始化爲可變請求,由於稍後要進行一些內容設置] 8 NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url]; 9 10 // 2.5 設置body 11 // 建立一個鏈接字符串(這個內容在之後的開發中接口文檔都有標註) 12 NSString *dataString = POST_BODY; 13 // 對接口字符串進行編碼(這一步千萬不能忘記) 14 NSData *postData = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 15 // 設置請求格式爲POST請求[這個地方在後面POST必須大寫] 16 [mutableRequest setHTTPMethod:@"POST"]; 17 // 設置請求體(body) 18 [mutableRequest setHTTPBody:postData]; 19 20 // 3. 鏈接服務器 21 NSData *data = [NSURLConnection sendSynchronousRequest:mutableRequest returningResponse:nil error:nil]; 22 23 // 4. 進行JSON數據解析 24 NSDictionary *resultDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 25 26 NSLog(@"%@", resultDict); 27 }
注意:post方法和get方法最大的區別就是在於post方法設置請求體(body)
注意:若網址字符串URLString中如有類對象,可使用此方法處理:[URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
代碼(代碼爲get請求,post請求同理,只要動態實現請求體):
1 - (IBAction)getAsynchronousRequest:(UIButton *)sender 2 { 3 // 1. 建立URL 4 NSURL *url = [NSURL URLWithString:GET_URL]; 5 6 // 2. 建立請求 7 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 8 9 // 方法一:使用delegate實現 10 [NSURLConnection connectionWithRequest:request delegate:self]; 11 } 12 13 #pragma mark - NSURLConnectionDataDelegate相關的代理方法 14 // 服務器開始響應 15 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 16 { 17 self.resultData = [NSMutableData data]; 18 } 19 20 // 開始接受數據 21 // 這個方法會重複執行,獲得的每段數據拼接在一塊兒就能夠了 22 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 23 { 24 [self.resultData appendData:data]; 25 } 26 27 // 結束服務器 28 - (void)connectionDidFinishLoading:(NSURLConnection *)connection 29 { 30 // 進行數據解析 31 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.resultData options:NSJSONReadingAllowFragments error:nil]; 32 33 NSLog(@"%@", dict); 34 }
8>異步Block
代碼(代碼爲get請求,post請求同理,只要動態實現請求體):
#pragma mark - 異步的get請求 - (IBAction)getAsynchronousRequest:(UIButton *)sender { // 1. 建立URL NSURL *url = [NSURL URLWithString:GET_URL]; // 2. 建立請求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3. 鏈接服務器 // 方法一:Block方法實現 // 參數1:請求對象 // 參數2:線程隊列 [NSOperationQueue mainQueue] 主隊列 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { // response是攜帶的接口信息 // data 請求下來的數據,接下來會使用到 // connectionError 錯誤信息 if (connectionError == nil) { // 4. 解析 NSDictionary *resultDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSLog(@"dict = %@", resultDict); // 先開闢子線程解析數據,而後在主線程刷新UI } }]; }
1> NSURLSession
在WWDC 2013中,Apple的團隊對NSURLConnection進行了重構,並推出了NSURLSession做爲替代。
• 支持後臺運行的網絡任務
• 暫停、中止、重啓網絡任務,再也不須要 NSOpation 封裝
• 請求可使用一樣的配置容器
• 不一樣的 session 可使用不一樣的私有存儲,block和代理能夠同時起做用
• 直接從文件系統上傳、下載
• 爲了方便程序員使用,蘋果提供了一個全局 session
• 全部的 任務(Task) 都是由 Session 發起的
• 全部的任務默認是掛起的,須要 Resume
2> 三種工做模式:
+ (NSURLSessionConfiguration *)defaultSessionConfiguration; 默認會話模式
+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration; 瞬時會話模式
+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier; 後臺會話模式
3> NSURLSession支持的三種任務
對數據加載:使用NSURLSessionDataTask和NSURLSessionTask二者沒有本質區別
處理下載任務使用:NSURLSessionDownloadTask
要處理上傳任務使用:NSURLSessionUploadTask
4> Block方法
① GET請求
1 #pragma mark GET的block方法 2 - (void)bolckMethod 3 { 4 // 方法1:使用Block 5 6 // 1. 建立URL 7 NSURL *url = [NSURL URLWithString:GET_URL]; 8 9 // 2. 建立session對象(iOS9以後推出) 10 NSURLSession *session = [NSURLSession sharedSession]; 11 12 // 3. 建立task請求任務 13 // NSURLSession是基於任務去完成相關的事件的 14 // 參數1. 請求的URL 15 // NSURLSessionTask 全部的任務都放在這個裏實現 16 // 對數據加載:使用NSURLSessionDataTask和NSURLSessionTask二者沒有本質區別 17 // 處理下載任務使用:NSURLSessionDownloadTask 18 // 要處理上傳任務使用:NSURLSessionUploadTask 19 NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 20 // 4. 解析數據 21 if (error == nil) { 22 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 23 NSLog(@"%@=get-block", dict); 24 } 25 }]; 26 27 // 5. 核心:啓動任務【千萬不能忘記】 28 // 緣由:NSURLSessionTask實例出來的任務處於掛起狀態,若是不啓動,不會走Block裏面的相關內容 29 [task resume]; 30 }
② POST請求
1 - (IBAction)postRequest:(UIButton *)sender 2 { 3 // Block方法 4 5 NSURL *url = [NSURL URLWithString:POST_URL]; 6 7 NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url]; 8 9 NSString *dataString = POST_BODY; 10 11 NSData *postData = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 12 13 [mRequest setHTTPMethod:@"POST"]; 14 15 [mRequest setHTTPBody:postData]; 16 17 NSURLSession *sessin = [NSURLSession sharedSession]; 18 19 NSURLSessionTask *task = [sessin dataTaskWithRequest:mRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 20 21 if (error == nil) { 22 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 23 NSLog(@"%@=post-block", dict); 24 } 25 }]; 26 27 [task resume]; 28 }
5> delegate方法
代碼(GET請求):
1 #pragma mark GET的delegate方法 2 - (void)delegateMethod 3 { 4 // 方法2:使用代理實現 5 // 1. 建立URL 6 NSURL *url = [NSURL URLWithString:GET_URL]; 7 8 // 2. 建立session 9 // 參數1:模式設置 10 /* 11 + (NSURLSessionConfiguration *)defaultSessionConfiguration; 默認會話模式 12 + (NSURLSessionConfiguration *)ephemeralSessionConfiguration; 瞬時會話模式 13 + (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier; 後臺會話模式 14 */ 15 // 參數2:代理 16 // 參數2:線程隊列模式 17 NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 18 19 // 3. 建立task對象 20 NSURLSessionDataTask *task = [session dataTaskWithURL:url]; 21 22 // 4. 啓動任務 23 [task resume]; 24 } 25 26 #pragma mark NSURLSessionDelegate協議方法 27 // 服務器開始響應 28 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler 29 { 30 // 容許服務器響應【在這裏只容許服務器響應了纔會接受到這個數據】 31 completionHandler(NSURLSessionResponseAllow); 32 // 初始化data,稍後進行片斷的拼接存儲 33 self.resultData = [NSMutableData data]; 34 } 35 36 // 接受數據拼接 37 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 38 { 39 // 反覆執行,而後拼接數據 40 [self.resultData appendData:data]; 41 } 42 43 // 數據接受完成,網絡請求結束 44 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 45 { 46 // 解析 47 if (error == nil) { 48 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.resultData options:NSJSONReadingAllowFragments error:nil]; 49 NSLog(@"%@=get-delegate", dict); 50 } 51 }
6> NSURLSession數據任務
適合於小的數據訪問,例如:JSON,XML,Plist,HTML,圖像