標籤:
網路開發總結
一、一個HTTP請求的基本要素
2.請求參數:用戶端發送給伺服器的資料
3.返回結果:伺服器返回給用戶端的資料
二、基本的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解析:逐個元素往下解析,適合大檔案
2> DOM解析:一口氣將整個XML文檔載入進記憶體,適合小檔案,使用最簡單
六、HTTP的通訊過程
1.請求
1> 請求行 : 要求方法、請求路徑、HTTP協議的版本
- GET /MJServer/resources/images/1.jpg HTTP/1.1
2> 要求標頭 : 用戶端的一些描述資訊
- * User-Agent : 用戶端的環境(軟體環境)
3> 請求體 : POST請求才有這個東西
2.響應
1> 狀態行(響應行): HTTP協議的版本、響應狀態代碼、響應狀態原因
2> 回應標頭:伺服器的一些描述資訊
- * Content-Type : 伺服器返回給用戶端的內容類型
- * Content-Length : 伺服器返回給用戶端的內容的長度(比如檔案的大小)
3> 實體內容(響應體)
七、HTTP的要求方法
1.GET
1> 特點
2> 缺點
- * 在url中暴露了所有的請求資料,不太安全
- * url的長度有限制,不能發送太多的參數
3> 使用場合
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提供了多種對伺服器資料處理的方式
三、監聽請求的過程
1> AFN提供了success和failure兩個block來監聽請求的過程(只能監聽成功和失敗)
- * success : 請求成功後調用
- * failure : 請求失敗後調用
2> ASI提供了3套方案,每一套方案都能監聽請求的完整過程
(監聽請求開始、接收到回應標頭資訊、接受到具體資料、接受完畢、請求失敗)
- * 成為代理,遵守協議,實現協議中的代理方法
- * 成為代理,不遵守協議,自訂代理方法
- * 設定block
四、在檔案下載和檔案上傳的使用難易度
1> AFN
- * 不容易監聽下載進度和上傳進度
- * 不容易實現斷點續傳
- * 一般只用來下載不大的檔案
2> ASI
- * 非常容易實現下載和上傳
- * 非常容易監聽下載進度和上傳進度
- * 非常容易實現斷點續傳
- * 下載或大或小的檔案都行
五、ASI提供了更多的實用功能
1> 控制圈圈要不要在請求過程中轉
2> 可以輕鬆地佈建要求之間的依賴:每一個請求都是一個NSOperation對象
3> 可以統一管理所有請求(還專門提供了一個叫做ASINetworkQueue來管理所有的請求對象)
- * 暫停\恢複\取消所有的請求
- * 監聽整個隊列中所有請求的下載進度和上傳進度
iOS開發——網路編程OC篇&總結