1.為什么要使用網(wǎng)絡(luò)?

People Lack Willpower挺据,Rather Than Strength炫刷!

客戶端和服務(wù)器之間如何通信?

  • 簡而言之:

    • 客戶端和服務(wù)器之間通信,由于使用不同語言編程,所以使用HTTP協(xié)議,完成雙方數(shù)據(jù)交流;客戶端以HTTP方式發(fā)送請求,服務(wù)器做出響應(yīng);
  • 常見請求發(fā)送方式:

    • NSURLConnection;
    • NSURLSession;
    • AFNetworking;
  • 發(fā)送請求步驟:

    // NSURLConnection:
    1.創(chuàng)建url;
    2.根據(jù)url創(chuàng)建request;
    3.使用NSURLConnection發(fā)送request;
    

HTTP

  • HTTP協(xié)議中向服務(wù)器發(fā)送請求的方法有多種,我們開發(fā)中常用的有g(shù)et/post;
    • 1.get:處理純粹獲得資源的請求,同時,參數(shù)不能太大,不超過1KB;
    • 2.post:處理需要保密(簡單保密),參數(shù)較大的請求

NSURLConnection

  • 發(fā)送請求步驟:

    // NSURLConnection:
    1.創(chuàng)建url;
    2.根據(jù)url創(chuàng)建request;
    3.使用NSURLConnection發(fā)送request;
    

    ?

  • 發(fā)送請求方式:

    • NSURLConnection中提供發(fā)送request的方案:
     1.sendSync....:主線程中進(jìn)行,比較耗時,會阻塞;
     2.sendAsync...:在子線程中進(jìn)行,可惜不能監(jiān)控服務(wù)器返回的響應(yīng)體中的data進(jìn)度
     3.initWithRequest.....可以做到...監(jiān)控進(jìn)度,且是子線程.
     或者:connectionWithRequest....
    

    ?

  • NSURLRequest
    • 用于保存請求地址/請求頭/請求體
    • 默認(rèn)情況下NSURLRequest會自動給我們設(shè)置好請求頭
    • request默認(rèn)情況下就是GET請求

登錄請求

  • get方法-------NSURLRequest同步/異步方法發(fā)送請求:
    /*=======================get同步方法發(fā)送request================================*/
- (void)sendSync
{
    // NSURLConnection-->http采用get請求|sendSync...方案發(fā)送請求

    // 1.創(chuàng)建URL
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];

    // 2.創(chuàng)建request
    // 默認(rèn)情況下NSURLRequest會自動給我們設(shè)置好請求頭
    // request默認(rèn)情況下就是GET請求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    // 3.發(fā)送request
    /*
     第一個參數(shù):需要請求的對象;
     第二個參數(shù):服務(wù)返回給我們的響應(yīng)頭信息;
     第三個參數(shù):錯誤信息;
     返回值:服務(wù)器返回給我們的響應(yīng)體
     */
    //    NSURLResponse *response = nil;
    // response的真實(shí)類型是:
    NSHTTPURLResponse *response = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

    // 打印響應(yīng)頭/體信息
    NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    NSLog(@"%@",response.allHeaderFields);

    NSLog(@"touches...即將結(jié)束-------");

    /*
     2015-09-07 09:19:32.287 01-NSURLConnection基本使用[1116:143990] {"success":"登錄成功"}
     2015-09-07 09:19:32.287 01-NSURLConnection基本使用[1116:143990] {
     "Content-Type" = "application/json;charset=UTF-8";
     Date = "Mon, 07 Sep 2015 01:19:29 GMT";
     Server = "Apache-Coyote/1.1";
     "Transfer-Encoding" = Identity;
     }
     2015-09-07 09:19:32.287 01-NSURLConnection基本使用[1116:143990] touches...即將結(jié)束-----
     */
}

?

/*============================get 異步方法發(fā)送request======================*/
- (void)sendAsync
{
    // 異步方法發(fā)送request
    // 1.創(chuàng)建URL
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
    // 2.創(chuàng)建request
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    // 3.異步發(fā)送request
    /*
     參數(shù)說明:
     參數(shù)一:需要請求的對象;
     參數(shù)二:回調(diào)block的隊(duì)列,決定了block在哪個線程中執(zhí)行;
     參數(shù)三:回調(diào)block(響應(yīng)體句柄)
     */
    // 注意:如果這里是同步,會阻塞當(dāng)前線程
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        /*
         response:響應(yīng)頭;
         data:響應(yīng)體;
         connectionError:錯誤信息;
         */
        NSLog(@"%@",request.HTTPBody);
        NSLog(@"%@",request.allHTTPHeaderFields);
        /*
         2015-09-07 09:59:20.422 01-NSURLConnection基本使用[1425:362793] (null)
         2015-09-07 09:59:20.423 01-NSURLConnection基本使用[1425:362793] (null)
         為啥是NULL????
         */
        NSLog(@"%@",response);
        NSLog(@"%@",[NSThread currentThread]);
        NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }];



    NSLog(@"touches...即將結(jié)束-------");

    /*
     2015-09-07 09:15:42.689 01-NSURLConnection基本使用[1075:121037] touches...即將結(jié)束-------
     2015-09-07 09:15:42.731 01-NSURLConnection基本使用[1075:121037] <NSThread: 0x7fd649d19e20>{number = 1, name = main}
     2015-09-07 09:15:42.731 01-NSURLConnection基本使用[1075:121037] {"success":"登錄成功"}
     */
}
  • 登錄請求:請求頭/體

    登錄請求.png

  • post方法發(fā)送請求,這里以異步為例:

    // POST方法:可監(jiān)控數(shù)據(jù)接收進(jìn)度
        // 1.創(chuàng)建URL
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
    
        // 2.創(chuàng)建request-->請求需要是可變類型
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        // 設(shè)置請求方式
        request.HTTPMethod = @"POST"; // 這里一定要大寫
        // httpbody:NSData類型
        // 注意: 如果是給POST請求傳遞參數(shù): 那么不需要寫?號,?只是get方法中參數(shù)與地址的分隔符!
        request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
    
        // 3.發(fā)送請求
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        }];
    
  • 中文問題

    • 說明:
      • 默認(rèn)情況下,get方法,需要轉(zhuǎn)碼;

      • 默認(rèn)情況下,post方法,不需要轉(zhuǎn)碼,因?yàn)閰?shù)放在請求體中,而且是以二進(jìn)制形式:

         request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
        
      • 開發(fā)中,考慮可能出錯,一律轉(zhuǎn)碼.

        // get方法中的中文轉(zhuǎn)碼:
        - (void)get_sendAsync
        {
            // 請求中的中文問題
            // get方法--->要先轉(zhuǎn)碼??
            // 1.url
            NSString *urlStr = @"http://120.25.226.186:32812/login2?username=小碼哥&pwd=520it&type=JSON";
            // 轉(zhuǎn)碼前
            NSLog(@"轉(zhuǎn)碼前---%@",urlStr);
            urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            NSLog(@"轉(zhuǎn)碼后---%@",urlStr);
            NSURL *url = [NSURL URLWithString:urlStr];
        
            // 2.request
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
            // 3.sendAsync
            [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
            }];
        
            /* 可見:get方法發(fā)送請求時,參數(shù)中不能有中文,需要轉(zhuǎn)碼
             2015-09-07 11:41:06.128 03-URL中文問題[2576:823835] 轉(zhuǎn)碼前---http://120.25.226.186:32812/login2?username=小碼哥&pwd=520it&type=JSON
             2015-09-07 11:41:06.128 03-URL中文問題[2576:823835] 轉(zhuǎn)碼后---http://120.25.226.186:32812/login2?username=%E5%B0%8F%E7%A0%81%E5%93%A5&pwd=520it&type=JSON
             2015-09-07 11:41:06.201 03-URL中文問題[2576:823835] {"success":"登錄成功"}
             */
        }
        //=======================================================
         // post方法--->無需轉(zhuǎn)碼??
            // 實(shí)際開發(fā)中,無論get/post都進(jìn)行轉(zhuǎn)碼,省的更改.
            // 1.url
            NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login2"];
        
            // 2.request
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
            request.HTTPMethod = @"POST";
            // 這里將參數(shù)轉(zhuǎn)換為二進(jìn)制data,無需再轉(zhuǎn)碼!??
            request.HTTPBody = [@"username=小碼哥&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding]; // type可以不寫
        
            // 3.sendAsync
            [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
            }];
        

        ?

下載請求

  • 說明:

    • 由于我們需要對下載過程進(jìn)行監(jiān)控,所以這里我們需要對NSURLConnection對象設(shè)置代理!
  • 下載請求步驟:

    • 1.url創(chuàng)建;
    • 2.request創(chuàng)建;
    • 3.創(chuàng)建connection,設(shè)置代理,執(zhí)行request;
    • 4.實(shí)現(xiàn)代理方法;
  • 示例:

    • 1.request

      -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
      {
       // 通過initWithRequest.../connection方法發(fā)送請求,可以監(jiān)控數(shù)據(jù)下載進(jìn)度
       // 1.URL創(chuàng)建---->下載請求??
       NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_02.png"];
      
       // 2.request創(chuàng)建
       NSURLRequest *request = [NSURLRequest requestWithURL:url];
      
       // 3.發(fā)送請求
       //    NSURLConnection *connect = [[NSURLConnection alloc] initWithRequest:request delegate:self];
       //    [NSURLConnection connectionWithRequest:request delegate:self];
       NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
       // 如果startImmediately:NO,則需要手動開啟發(fā)動請求
       [connection start];
        //    NSLog(@"%@",connect);
       /*
      <NSURLConnection: 0x7f83c0716c70> 
        { request: <NSURLRequest: 0x7f83c0745600> { URL: http://120.25.226.186:32812/resources/images/minion_02.png } }
        // 可見這里不是我們想要下載的東西,可以不寫
        */
      }
      
    • 2.代理方法

      // --------------------------------代理方法----------------------------
      #pragma mark - NSURLConnectionDataDelegate
      // 只要接收到服務(wù)器的響應(yīng)就會調(diào)用
      // response:響應(yīng)頭
      - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
      {
       //    NSLog(@"%s", func);
        // 在此處,我們可以獲得服務(wù)器返回給我們的文件總大小
        self.totalLength = response.expectedContentLength;
        // response中包含的屬性含義:
        // 收到數(shù)據(jù)建議名字
        NSLog(@"%@",response.suggestedFilename);
        // 服務(wù)器響應(yīng)數(shù)據(jù)大小
        NSLog(@"%lld",response.expectedContentLength);
        // 請求url
        NSLog(@"%@",response.URL);
        // 數(shù)據(jù)類型
        NSLog(@"%@",response.MIMEType);
      
        //     2015-09-07 11:06:40.240 02-NSURLConnection其他用法[2140:690910] minion_02.png
        //     2015-09-07 11:06:40.241 02-NSURLConnection其他用法[2140:690910] 43852
        //     2015-09-07 11:06:40.241 02-NSURLConnection其他用法[2140:690910] http://120.25.226.186:32812/resources/images/minion_02.png
        //     2015-09-07 11:06:40.241 02-NSURLConnection其他用法[2140:690910] image/png
      
         NSLog(@"%@",response);
        //    可見此處response包含兩大部分內(nèi)容:1.請求url;2.響應(yīng)頭;
        //     2015-09-07 10:59:48.113 02-NSURLConnection其他用法[1975:661374] <NSHTTPURLResponse: 0x7feadb7d5940> { URL: http://120.25.226.186:32812/resources/images/minion_02.png } { status code: 200, headers {
        //     "Accept-Ranges" = bytes;
        //     "Content-Length" = 43852;
        //     "Content-Type" = "image/png";
        //     Date = "Mon, 07 Sep 2015 02:42:51 GMT";
        //     Etag = "W/\"43852-1409456092000\"";
        //     "Last-Modified" = "Sun, 31 Aug 2014 03:34:52 GMT";
        //     Server = "Apache-Coyote/1.1";
        //     } }
        }
      
      // 接收到服務(wù)器返回的數(shù)據(jù)時調(diào)用(該方法可能調(diào)用一次,或者多次)
      // data:服務(wù)器返回的數(shù)據(jù)(是當(dāng)前一次返回的,不是累積量)
      - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
      {
        //    NSLog(@"%s", func);
        self.currentLength += data.length;
        NSLog(@"%f",1.0 * self.currentLength / self.totalLength);
      }
      
      // 數(shù)據(jù)下載完成時調(diào)用
      - (void)connectionDidFinishLoading:(NSURLConnection *)connection
      {
        //    NSLog(@"%s", func);
        self.currentLength = 0;
      }
      
      // 請求錯誤時調(diào)用(請求超時)
      /*
      connection:didFailWithError: will be called at most once, if an error occurs during a resource load.  No other callbacks will be made after.<p>
      */
      - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
      {
        //    NSLog(@"%s", func);
      }
      /* 可見:服務(wù)器響應(yīng):響應(yīng)頭--->響應(yīng)體-->下載完成
      2015-09-07 10:57:22.590 02-NSURLConnection其他用法[1939:649504] -[ViewController connection:didReceiveResponse:]
      2015-09-07 10:57:22.591 02-NSURLConnection其他用法[1939:649504] -[ViewController connection:didReceiveData:]
      2015-09-07 10:57:22.591 02-NSURLConnection其他用法[1939:649504] -[ViewController connectionDidFinishLoading:]
      */
      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市昔期,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晌区,老刑警劉巖歇式,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蕾盯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蓝丙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門级遭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渺尘,你說我怎么就攤上這事挫鸽。” “怎么了鸥跟?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵丢郊,是天一觀的道長。 經(jīng)常有香客問我医咨,道長枫匾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任拟淮,我火速辦了婚禮婿牍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惩歉。我一直安慰自己等脂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布撑蚌。 她就那樣靜靜地躺著上遥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪争涌。 梳的紋絲不亂的頭發(fā)上粉楚,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼模软。 笑死伟骨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的燃异。 我是一名探鬼主播携狭,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼回俐!你這毒婦竟也來了逛腿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仅颇,失蹤者是張志新(化名)和其女友劉穎哄酝,沒想到半個月后炒嘲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡切距,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年焚刺,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛉抓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撑碴。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡伯病,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出明场,到底是詐尸還是另有隱情,我是刑警寧澤李丰,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布苦锨,位于F島的核電站,受9級特大地震影響趴泌,放射性物質(zhì)發(fā)生泄漏舟舒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一嗜憔、第九天 我趴在偏房一處隱蔽的房頂上張望秃励。 院中可真熱鬧,春花似錦吉捶、人聲如沸夺鲜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽币励。三九已至,卻和暖如春珊拼,著一層夾襖步出監(jiān)牢的瞬間食呻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仅胞,地道東北人每辟。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像干旧,于是被迫代替她去往敵國和親渠欺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容