網(wǎng)絡(luò)請(qǐng)求相關(guān)

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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,654評(píng)論 4 61
  • get 和post 的主要區(qū)別體現(xiàn)在數(shù)據(jù)傳遞上,get:在請(qǐng)求的URL后面以?的形式跟上發(fā)給服務(wù)器的參數(shù),多個(gè)參數(shù)...
    tiGress閱讀 417評(píng)論 0 2
  • 今天媽媽給老家的表姐打了個(gè)電話(huà),勾起了我的鄉(xiāng)思。最近在看心理學(xué)小說(shuō),自卑與超越,了解到了童年對(duì)人的一生的重大影響。...
    天空中的魚(yú)閱讀 641評(píng)論 0 2
  • 夏宛之一邊喝著咖啡,一邊寫(xiě)著小說(shuō),半夜外面突然下起了雨,她瞟了一眼電腦右下角的時(shí)間,凌晨?jī)牲c(diǎn),這個(gè)時(shí)間這個(gè)城市的人...
    長(zhǎng)空下是道安靜的藍(lán)閱讀 254評(píng)論 0 2

友情鏈接更多精彩內(nèi)容