1、網(wǎng)絡(luò)請(qǐng)求方式的改變
1)NSURLConnection: iOS9之前使用
2)NSURLSession: iOS9 使用這個(gè)類(lèi)
2、后臺(tái)服務(wù)器傳輸協(xié)議由HTTP改成HTTPS
1)iOS開(kāi)發(fā) -> info.plist -> App Transport Security Settings ->Allow Arbitrary Loads -> YES
I
二、URL:
1、概念:
Uniform Resource Locator 統(tǒng)一資源定位符
2、結(jié)構(gòu)
1、URL包含模式(或稱(chēng)協(xié)議)、服務(wù)器名稱(chēng)(或IP地址)、 路徑和文件名
https :// www.baidu.com /img/bd_logo1.png
可以通過(guò)URL找到 服務(wù)器中的文件
URL中如果包含中文:
NSString *s = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
練習(xí):通過(guò)連接加載圖片
三、HTTP:
1、全稱(chēng)
Hypertext Transfer Protocol 超文本傳輸協(xié)議
https——用安全套接字層 傳送的超文本傳輸協(xié)議
2、概念:
超文本傳輸協(xié)議是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。設(shè)計(jì)HTTP最初的目的是為了提供一種 發(fā)布和接收 HTML頁(yè)面的方法。1960年美國(guó)人Ted Nelson構(gòu)思了一種通過(guò)計(jì)算機(jī)處理文本信息的方法,并稱(chēng)之為超文本(hypertext),這成為了HTTP超文本傳輸協(xié)議標(biāo)準(zhǔn)架構(gòu)的發(fā)展根基
是用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議
3、通訊流程
1)首先客戶(hù)端發(fā)送一個(gè)請(qǐng)求(request)給服務(wù)器
request由兩部分組成:
請(qǐng)求頭
請(qǐng)求體
2)服務(wù)器在接收到這個(gè)請(qǐng)求后將生成一個(gè)響應(yīng)(response)返回給客戶(hù)端
response由兩部分組成:
相應(yīng)頭
相應(yīng)體
4、常用請(qǐng)求方法
1) get 一般上請(qǐng)求數(shù)據(jù)時(shí)使用,直接將參數(shù)暴漏到url中,參數(shù)的長(zhǎng)度有限制
2) post 一般上傳數(shù)據(jù)時(shí)使用,將敏感的參數(shù)放到請(qǐng)求體中,在url中看不到,POST傳遞的數(shù)據(jù)量沒(méi)有限制(具體還得看服務(wù)器的處理能力)
PS:get post的選擇
1)如果要傳遞大量數(shù)據(jù) 比如文件上傳 只能用POST請(qǐng)求
2)GET的安全性比POST要差些 如果包含機(jī)密\敏感信息 建議用POST
3)如果僅僅是索取數(shù)據(jù)(數(shù)據(jù)查詢(xún)) 建議使用GET
4)如果是增加、修改、刪除數(shù)據(jù) 建議使用POST
5、發(fā)送了一個(gè)請(qǐng)求 沒(méi)有任何回應(yīng)
1)沒(méi)聯(lián)網(wǎng)
2)請(qǐng)求內(nèi)容錯(cuò)誤:URL
練習(xí):通過(guò)瀏覽器了解HTTP請(qǐng)求過(guò)程
四、JSON和XML
1、基本概念
查看博客 http://www.itdecent.cn/p/5df890302416
2、JSON解析
[NSJSONSerialization JSONObjectWithData:nil options:NSJSONReadingMutableContainers error:nil];
NSJSONReadingMutableContainers:返回可變?nèi)萜?,NSMutableDictionary或NSMutableArray。
NSJSONReadingMutableLeaves:返回的JSON對(duì)象中字符串的值為NSMutableString,
NSJSONReadingAllowFragments:允許JSON字符串最外層既不是NSArray也不是NSDictionary,但必須是有效的JSON Fragment。例如使用這個(gè)選項(xiàng)可以解析 @“123” 這樣的字符串
3、XML解析
1)準(zhǔn)備工作
將GDataXMLNode文件加入至工程中
向Frameworks文件中添加libxml2.dylib庫(kù)
在Croups & Files 側(cè)邊欄中雙擊工程圖標(biāo),找到 build setting修改兩個(gè)屬性:
Search Paths中 找到Header Search Paths 將其對(duì)應(yīng)的值修改為:/usr/include/libxml2,
在Linking中找到 Other Linker Flags 對(duì)應(yīng)的值改為:-lxml2。
2) 讀取xml文件
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data error:nil];
3)獲取到根節(jié)點(diǎn)
GDataXMLElement *rootElement = [document rootElement];
4)取出節(jié)點(diǎn)的屬性值
[element attributeForName:@"id"]
4)根據(jù)節(jié)點(diǎn)取值
[rootElement elementsForName:@"from"]
練習(xí):自己寫(xiě)JSON和XML串并解析
五、iOS下的HTTP請(qǐng)求過(guò)程
1、準(zhǔn)備request
1)概念
iOS下使用NSURLRequest或者NSMutableURLRequest對(duì)象作為request,后者可以添加請(qǐng)求頭
在請(qǐng)求中需要兩個(gè)基本元素:
要加載的URL
加載的方式(默認(rèn)是get)
如果需要,可以采用如下方式添加請(qǐng)求頭、請(qǐng)求體
[request addValue:nil forHTTPHeaderField:nil]; //可變請(qǐng)求對(duì)象,才設(shè)置請(qǐng)求頭
request.HTTPBody //請(qǐng)求體
2)request的緩存策略問(wèn)題
不考慮緩存策略
+ (instancetype)requestWithURL:(NSURL *)URL;
- (instancetype)initWithURL:(NSURL *)URL
考慮緩存策略 超時(shí)限制
+ (instancetype)requestWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval
- (instancetype)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval
緩存策略的不同
默認(rèn)的緩存策略 如果緩存不存在 直接從服務(wù)端獲取 如果緩存存在 會(huì)根據(jù)response中的Cache-Control字段判斷下一步操作
NSURLRequestUseProtocolCachePolicy,
忽略緩存 重新請(qǐng)求
NSURLRequestReloadIgnoringCacheData
有緩存就使用 不管其有效性 沒(méi)有緩存就重新請(qǐng)求
NSURLRequestReturnCacheDataElseLoad
有緩存就用緩存 沒(méi)有緩存就不發(fā)請(qǐng)求 當(dāng)做請(qǐng)求出錯(cuò)處理(用于離線模式)
NSURLRequestReturnCacheDataDontLoad
3)緩存策略的選擇,如果請(qǐng)求某個(gè)URL的返回?cái)?shù)據(jù)
經(jīng)常更新:不能用緩存 比如股票、彩票數(shù)據(jù)
一成不變:果斷用緩存
偶爾更新:可以定期更改緩存策略 或者 清除緩存
提示:如果大量使用緩存 會(huì)越積越大 建議定期清除緩存
2、使用NSURLSession發(fā)送請(qǐng)求
1)創(chuàng)建一個(gè)NSURLSession對(duì)象,來(lái)幫助發(fā)送request請(qǐng)求
//數(shù)據(jù)請(qǐng)求,返回的是一個(gè)NSURLSessionDataTask對(duì)象,專(zhuān)門(mén)用來(lái)做數(shù)據(jù)類(lèi)的網(wǎng)絡(luò)請(qǐng)求任務(wù)
[session dataTaskWithRequest:nil completionHandler:nil];
//上傳請(qǐng)求,返回的是一個(gè)NSURLSessionUploadTask對(duì)象,專(zhuān)門(mén)用來(lái)做上傳類(lèi)的網(wǎng)絡(luò)請(qǐng)求任務(wù)
[session uploadTaskWithRequest:nil fromData:nil completionHandler:nil];
//下載請(qǐng)求,返回的是一個(gè)NSURLSessionDownloadTask對(duì)象,專(zhuān)門(mén)用來(lái)做下載類(lèi)的網(wǎng)絡(luò)請(qǐng)求任務(wù)
[session downloadTaskWithRequest:nil completionHandler:nil];
2)開(kāi)始請(qǐng)求
[sessionTask resume];
3、獲取響應(yīng)頭和相應(yīng)體信息
//獲取到相應(yīng)頭
NSHTTPURLResponse *httpResopnse = (NSHTTPURLResponse *)response;
//獲取響應(yīng)體
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
六:網(wǎng)絡(luò)環(huán)境判斷
Reachability
(1)導(dǎo)入類(lèi)名
(2)創(chuàng)建對(duì)象 hostName盡量用一個(gè)穩(wěn)定的網(wǎng)絡(luò)
(3)添加觀察者 接收網(wǎng)絡(luò)環(huán)境發(fā)生改變的通知 通知的名字 kReachabilityChangedNotification
(4)開(kāi)始檢測(cè)
(5)在通知中得到 Reachability對(duì)象 not.object 獲得網(wǎng)絡(luò)環(huán)境的狀態(tài)