iOS開發——網路編程OC篇&總結

來源:互聯網
上載者:User

標籤:

網路開發總結

一、一個HTTP請求的基本要素

  • 1.請求URL:用戶端通過哪個路徑找到伺服器


2.請求參數:用戶端發送給伺服器的資料

  • * 比如登入時需要發送的使用者名稱和密碼


3.返回結果:伺服器返回給用戶端的資料

  • * 一般是JSON資料或者XML資料


二、基本的HTTP請求的步驟(移動用戶端)
1.拼接"請求URL" + "?" + "請求參數"

  • * 請求參數的格式:參數名=參數值
  • * 多個請求參數之間用&隔開:參數名1=參數值1&參數名2=參數值2
  • * 比如:http://localhost:8080/MJServer/login?username=123&pwd=456


2.發送請求

3.解析伺服器返回的資料

三、JSON解析
1.利用NSJSONSerialization類解析

  • * JSON資料(NSData) --> Foundation-OC對象(NSDictionary、NSArray、NSString、NSNumber)
  • + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;


2.JSON解析規律

  • * { } --> NSDictionary @{ }
  • * [ ] --> NSArray @[ ]
  • * " " --> NSString @" "
  • * 10 --> NSNumber @10


四、NSURLConnection
1.發布非同步請求01--block回調

  • + (void)sendAsynchronousRequest:(NSURLRequest*) request
  •     queue:(NSOperationQueue*) queue
  •     completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler
  • * request : 需要發送的請求
  • * queue : 一般用主隊列,存放handler這個任務
  • * handler : 當請求完畢後,會自動調用這個block


2.利用NSURLConnection發送請求的基本步驟
1> 建立URL

  • NSURL *url = [NSURL URLWithString:@"http://4234324/5345345"];


2> 建立request

  • NSURLRequest *request = [NSURLRequest requestWithURL:url];


3> 發送請求

  • [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:
  •  ^(NSURLResponse *response, NSData *data, NSError *connectionError) {

4> 處理伺服器返回的資料

  •  }];


五、XML
1.文法
1> 文檔聲明

  • <?xml version="1.0" encoding="UTF-8" ?>


2> 元素
3> 屬性

  • <videos>
  •     <video name="小黃人 第01部" length="10"/>
  •     <video name="小黃人 第01部" length="10"/>
  • </videos>
  • * videos和video是元素(節點)
  • * name和length叫做元素的屬性
  • * video元素是videos元素的子項目


2.解析
1> SAX解析:逐個元素往下解析,適合大檔案

  • * NSXMLParser


2> DOM解析:一口氣將整個XML文檔載入進記憶體,適合小檔案,使用最簡單

  • * GDataXML


六、HTTP的通訊過程
1.請求
1> 請求行 : 要求方法、請求路徑、HTTP協議的版本

  • GET /MJServer/resources/images/1.jpg HTTP/1.1


2> 要求標頭 : 用戶端的一些描述資訊

  • * User-Agent : 用戶端的環境(軟體環境)


3> 請求體 : POST請求才有這個東西

  • * 請求參數,發給伺服器的資料


2.響應
1> 狀態行(響應行): HTTP協議的版本、響應狀態代碼、響應狀態原因

  • HTTP/1.1 200 OK


2> 回應標頭:伺服器的一些描述資訊

  • * Content-Type : 伺服器返回給用戶端的內容類型
  • * Content-Length : 伺服器返回給用戶端的內容的長度(比如檔案的大小)


3> 實體內容(響應體)

  • * 伺服器返回給用戶端具體的資料,比如檔案資料


七、HTTP的要求方法
1.GET
1> 特點

  • * 所有請求參數都拼接在url後面


2> 缺點

  • * 在url中暴露了所有的請求資料,不太安全
  • * url的長度有限制,不能發送太多的參數


3> 使用場合

  • * 如果僅僅是向伺服器索要資料,一般用GET請求


4> 如何發送一個GET請求
* 預設就是GET請求
// 1.URL

  • NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];

// 2.請求

  • NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 3.發送請求

  • [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  • }];


2.POST
1> 特點

  • * 把所有請求參數放在請求體(HTTPBody)中
  • * 理論上講,發給伺服器的資料的大小是沒有限制


2> 使用場合

  • * 除開向伺服器索要資料以外的請求,都可以用POST請求
  • * 如果發給伺服器的資料是一些隱私、敏感的資料,絕對要用POST請求


3> 如何發送一個POST請求
// 1.建立一個URL : 請求路徑

  • NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/login"];


// 2.建立一個請求

  • NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  • // 佈建要求方法
  • request.HTTPMethod = @"POST";
  • // 佈建要求體 : 請求參數
  • NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", usernameText, pwdText];
  • // NSString --> NSData
  • request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];


八、NSMutableURLRequest的常用方法
1.設定逾時
request.timeoutInterval = 5;
// NSURLRequest是不能設定逾時的,因為這個對象是不可變的

九、URL轉碼
1.URL中不能包含中文,得對中文進行轉碼(加上一堆的%)

  • NSString *urlStr = [NSString stringWithFormat:@"http://localhost/login?username=喝喝&pwd=123"];
  • urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  • // urlStr == @"http://localhost/login?username=%E5%96%9D%E5%96%9D&pwd=123"


十、資料安全
1.網路資料加密
1> 加密對象:隱私資料,比如密碼、銀行資訊
2> 加密方案
* 提交隱私資料,必須用POST請求
* 使用密碼編譯演算法對隱私資料進行加密,比如MD5
3> 加密增強:為了加大破解的難度

  • * 對明文進行2次MD5 : MD5(MD5($pass))
  • * 先對明文撒鹽,再進行MD5 : MD5($pass.$salt)


2.本機存放區加密
1> 加密對象:重要的資料,比如遊戲資料

3.代碼安全問題
1> 現在已經有工具和技術能反編譯出原始碼:逆向工程

  • * 反編譯出來的都是純C語言的,可讀性不高
  • * 最起碼能知道原始碼裡面用的是哪些架構


2> 參考書籍:《iOS逆向工程》

3> 解決方案:發布之前對代碼進行混淆
* 混淆之前

  • @interface iCocosPerson :NSObject
  • - (void)run;
  • - (void)eat;
  • @end

 

* 混淆之後

  • @interface A :NSObject
  • - (void)a;
  • - (void)b;
  • @end


十一、監測網路狀態

1.主動監測監測網路狀態

// 是否WIFI

  • + (BOOL)isEnableWIFI {
  •     return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
  • }

 

// 是否3G

  • + (BOOL)isEnable3G {
  •     return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
  • }


2.監控網路狀態

1> 監聽通知

  • [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];

 

2> 開始監聽網路狀態

  • // 獲得Reachability對象
  • self.reachability = [Reachability reachabilityForInternetConnection];
  • // 開始監控網路
  • [self.reachability startNotifier];

 

3> 移除監聽

  • [self.reachability stopNotifier];
  • [[NSNotificationCenter defaultCenter] removeObserver:self];

 

————————————————————————————————————————————————————————————————————————————————————————

一、大檔案下載
1.方案:利用NSURLConnection和它的代理方法
1> 發送一個請求

// 1.URL

  • NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos.zip"];

// 2.請求

  • NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 3.下載(建立完conn對象後,會自動發起一個非同步請求)

  • [NSURLConnection connectionWithRequest:request delegate:self];


2> 在代理方法中處理伺服器返回的資料
/**
 在接收到伺服器的響應時:
 1.建立一個空的檔案
 2.用一個控制代碼對象關聯這個空的檔案,目的是:方便後面用控制代碼對象往檔案後面寫資料
 */

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

    // 檔案路徑

    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

    NSString *filepath = [caches stringByAppendingPathComponent:@"videos.zip"];

 

    // 建立一個空的檔案 到 沙箱中

    NSFileManager *mgr = [NSFileManager defaultManager];

    [mgr createFileAtPath:filepath contents:nil attributes:nil];

 

    // 建立一個用來寫資料的檔案控制代碼

    self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filepath];

}


/**
 在接收到伺服器返回的檔案資料時,利用控制代碼對象往檔案的最後面追加資料
 */

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    // 移動到檔案的最後面

    [self.writeHandle seekToEndOfFile];

 

    // 將資料寫入沙箱

    [self.writeHandle writeData:data];

}


/**
 在所有資料接收完畢時,關閉控制代碼對象
 */

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

    // 關閉檔案

    [self.writeHandle closeFile];

    self.writeHandle = nil;

}


2.注意點:千萬不能用NSMutableData來拼接伺服器返回的資料

二、NSURLConnection發送非同步請求的方法

1.block形式 - 除開大檔案下載以外的操作,都可以用這種形式

  • [NSURLConnection sendAsynchronousRequest:<#(NSURLRequest *)#> queue:<#(NSOperationQueue *)#> completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  • }];


2.代理形式 - 一般用在大檔案下載

// 1.URL

  • NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/login?username=123&pwd=123"];

// 2.請求

  • NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 3.下載(建立完conn對象後,會自動發起一個非同步請求)

  • [NSURLConnection connectionWithRequest:request delegate:self];


三、NSURLSession
1.使用步驟

  • 1> 獲得NSURLSession對象
  • 2> 利用NSURLSession對象建立對應的任務(Task)
  • 3> 開始任務([task resume])


2.獲得NSURLSession對象

1> [NSURLSession sharedSession]

2>

  • NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];
  • self.session = [NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:[NSOperationQueue mainQueue]];

3.任務類型
1> NSURLSessionDataTask
* 用途:用於非檔案下載的GET\POST請求

  • NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request];
  • NSURLSessionDataTask *task = [self.session dataTaskWithURL:url];
  • NSURLSessionDataTask *task = [self.session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
  • }];


2> NSURLSessionDownloadTask
* 用途:用於檔案下載(小檔案、大檔案)

  • NSURLSessionDownloadTask *task = [self.session downloadTaskWithRequest:request];
  • NSURLSessionDownloadTask *task = [self.session downloadTaskWithURL:url];
  • NSURLSessionDownloadTask *task = [self.session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {   
  • }];
 ————————————————————————————————————————————————————————————————AFN與ASI的區別(面試用)一、底層實現
1> AFN的底層基於OC的NSURLConnection和NSURLSession
2> ASI的底層基於純C語言的CFNetwork架構
3> ASI的運行效能 高於 AFN

二、對伺服器返回的資料處理
1> ASI沒有直接提供對伺服器資料處理的方式,直接返回data\string
2> AFN提供了多種對伺服器資料處理的方式
  • * JSON處理
  • * XML處理
  • * 其他處理

三、監聽請求的過程
1> AFN提供了success和failure兩個block來監聽請求的過程(只能監聽成功和失敗)
  • * success : 請求成功後調用
  • * failure : 請求失敗後調用

2> ASI提供了3套方案,每一套方案都能監聽請求的完整過程
(監聽請求開始、接收到回應標頭資訊、接受到具體資料、接受完畢、請求失敗)
  • * 成為代理,遵守協議,實現協議中的代理方法
  • * 成為代理,不遵守協議,自訂代理方法
  • * 設定block

四、在檔案下載和檔案上傳的使用難易度
1> AFN
  • * 不容易監聽下載進度和上傳進度
  • * 不容易實現斷點續傳
  • * 一般只用來下載不大的檔案

2> ASI
  • * 非常容易實現下載和上傳
  • * 非常容易監聽下載進度和上傳進度
  • * 非常容易實現斷點續傳
  • * 下載或大或小的檔案都行

五、ASI提供了更多的實用功能
1> 控制圈圈要不要在請求過程中轉
2> 可以輕鬆地佈建要求之間的依賴:每一個請求都是一個NSOperation對象
3> 可以統一管理所有請求(還專門提供了一個叫做ASINetworkQueue來管理所有的請求對象)
  • * 暫停\恢複\取消所有的請求
  • * 監聽整個隊列中所有請求的下載進度和上傳進度
 

iOS開發——網路編程OC篇&總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.