網絡之數據請求

1. HTTP和HTTPS協議

 1> URL

  URL全稱是Uniform Resource Locator(統一資源定位符)經過1個URL,能找到互聯網上惟一的1個資源mysql

  URL就是資源的地址、位置,互聯網上的每一個資源都有一個惟一的URL程序員

  URL的基本格式=協議://主機地址/路徑sql

   http://www.cnblogs.com/gfxxbk/編程

   協議:不一樣的協議,表明着不一樣的資源查找方式,資源傳輸方式瀏覽器

   主機地址:存放資源的主機的IP地址(域名)  緩存

   路徑:資源在主機中的位置安全

 2> HTTP協議的概念

  HTTP協議,Hyper Text Transfer Protocol(超文本傳輸協議)是用於從萬維網(WWW)服務器傳送超文本到本地瀏覽器的傳輸協議,HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。服務器

 3> HTTP的工做原理

  HTTP 協議採用請求/響應模型。客戶端向服務器發送一個請求報文,服務器以一個狀態做爲響應。網絡

 4> C/S模式

  Client和Server經常分別處在相距很遠的兩臺計算機上,Client程序的任務是將用戶的要求提交給Server程序,再將Server程序返回的結果以特定的形式顯示給用戶;Server程序的任務是接收客戶程序提出的服務請求,進行相應的處理,再將結果返回給客戶程序session

 

 5> HTTPS

  HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協議 它是一個安全通訊通道,它基於HTTP開發,用於在客戶計算機和服務器之間交換信息。 它使用安全套接字層(SSL)進行信息交換,簡單來講它是HTTP的安全版。 HTTPS協議使用SSL在發送方把原始數據進行加密,而後在接收方進行解密,加密和解密須要發送方和接受方經過交換共知的密鑰來實現,所以,所傳送的數據不容易被網絡黑客截獲和解密。

 6> SSL

  SSL是Netscape公司所提出的安全保密協議,在瀏覽器(如Internet Explorer、Netscape Navigator)和Web服務器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之間構造安全通道來進行數據傳輸,SSL運行在TCP/IP層之上、應用層之下,爲應用程序提供加密數據通道,

 7> HTTP和HTTPS的異同

  • https協議須要到ca申請證書,通常免費證書不多,須要交費。

  • http是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的ssl加密傳輸協議

  • http和https使用的是徹底不一樣的連接方式,用的端口也不同,前者是80,後者是443.

  • http的連接很簡單,是無狀態的.

  • https是協議是由SSL+HTTP協議構建的可進行加密傳輸,身份認證的網絡協議要比http安全

2. HTTP協議的常見請求方式

 1> 請求方式

  • GET

  • POST

 2> 兩種請求方式的比較

  • 給服務器傳輸數據的方式不一樣

  GET:經過網址字符串

  POST:經過data

  • 傳輸數據的大小    

  GET:網址字符串最多255字節

  POST:使用NSData,容量超過1G

  • 安全性

  GET:全部傳輸給服務的數據,顯示在網址裏,相似於密碼的明文輸入,直接可見

  POST:數據被轉成NSData(二進制數據),相似於密碼的密文輸入,沒法直接讀取

3. iOS實現網絡編程(iOS7以前的版本,如今已經棄用,可是仍然可使用)

 1> HTTP協議請求如何實現

  網絡請求地址對象NSURL的做用及用法

  網絡請求對象NSURLRequest,NSMutableURLRequest的做用及用法

  網絡連接對象NSURLConnection的做用及用法

  網絡連接協議NSURLConnectionDelegate的做用及用法

 2> NSURL

  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://(本地文件協議)

 3> 鏈接方式

  • 同步鏈接:程序容易出現卡死現象

  • 異步鏈接:等待數據返回

  異步鏈接有兩種實現方式:

   ① 設置代理,接收數據

   ② 實現block

 4> 打開Xcode網絡適配

  使用http請求 :NSAppTransportSecurity 字典 ,NSAllowsArbitraryLoads YES 
  代碼:

1  <key>NSAppTransportSecurity</key>
2      <dict>
3         <key>NSAllowsArbitraryLoads</key>
4              <true/>
5     </dict>

  圖表:

  

 5> 同步鏈接

  ① 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]];

 7> 異步代理

  代碼(代碼爲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
        }
    }];
}
複製代碼

4. iOS7以後請求變化

 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,圖像

相關文章
相關標籤/搜索