iOS - 網(wǎng)絡編程 <1>

1.網(wǎng)絡基礎

  • 1.1 網(wǎng)絡基礎
    001 網(wǎng)絡基本概念
        1-1 客戶端(就是手機或者ipad等手持設備上面的APP)
        1-2 服務器(遠程服務器-本地服務器)
        1-3 請求(客戶端索要數(shù)據(jù)的方式)
        1-4 響應(需要客戶端解析數(shù)據(jù))
        1-5 數(shù)據(jù)庫(服務器的數(shù)據(jù)從哪里來)
  • 1.2 Http

      001 URL
          1-1 如何找到服務器(通過一個唯一的URL)
          1-2 URL介紹
              a. 統(tǒng)一資源定位符
              b. url格式(協(xié)議\主機地址\路徑)
                  協(xié)議:不同的協(xié)議,代表著不同的資源查找方式怎诫、資源傳輸方式
                  主機地址:存放資源的主機(服務器)的IP地址(域名)
                  路徑:資源在主機(服務器)中的具體位置
    
          1-3 請求協(xié)議
              【file】訪問的是本地計算機上的資源腊凶,格式是file://(不用加主機地址)
              【ftp】訪問的是共享主機的文件資源谜酒,格式是ftp://
              【mailto】訪問的是電子郵件地址驹暑,格式是mailto:
              【http】超文本傳輸協(xié)議瓷们,訪問的是遠程的網(wǎng)絡資源界牡,格式是http://(網(wǎng)絡請求中最常用的協(xié)議)
    
      002 http協(xié)議
          2-1 http協(xié)議簡單介紹
              a.超文本傳輸協(xié)議
              b.規(guī)定客戶端和服務器之間的數(shù)據(jù)傳輸格式
              c.讓客戶端和服務器能有效地進行數(shù)據(jù)溝通
    
          2-2 http協(xié)議優(yōu)缺點
              a.簡單快速(協(xié)議簡單,服務器端程序規(guī)模小碑诉,通信速度快)
              b.靈活(允許傳輸各種數(shù)據(jù))
              c.非持續(xù)性連接(1.1之前版本是非持續(xù)的,即限制每次連接只處理一個請求德挣,服務器對客戶端的請求做出響應后快毛,馬上斷開連接,這種方式可以節(jié)省傳輸時間)
          2-3 基本通信過程
              a.請求:客戶端向服務器索要數(shù)據(jù)
              b.響應:服務器返回客戶端相應的數(shù)據(jù)
    
      003 GET和POST請求
          3-1 http里面發(fā)送請求的方法
          GET(常用)唠帝、POST(常用)、OPTIONS贴铜、HEAD瀑晒、PUT、DELETE苔悦、TRACE、CONNECT灾挨、PATCH
    
          3-2 GET和POST請求的對比【區(qū)別在于參數(shù)如何傳遞】
              GET
              在請求URL后面以?的形式跟上發(fā)給服務器的參數(shù),多個參數(shù)之間用&隔開劳澄,比如
              http://ww.baidi.com/login?username=123&pwd=234&type=JSON
              由于瀏覽器和服務器對URL長度有限制,因此在URL后面附帶的參數(shù)是有限制的秒拔,通常不能超過1KB
    
              POST
              發(fā)給服務器的參數(shù)全部放在請求體中
              理論上砂缩,POST傳遞的數(shù)據(jù)量沒有限制(具體還得看服務器的處理能力)
    
          3-3 如何選擇【除簡單數(shù)據(jù)查詢外,其它的一律使用POST請求】
              a.如果要傳遞大量數(shù)據(jù)庵芭,比如文件上傳,只能用POST請求
              b.GET的安全性比POST要差些眨唬,如果包含機密\敏感信息好乐,建議用POST
              c.如果僅僅是索取數(shù)據(jù)(數(shù)據(jù)查詢),建議使用GET
              d.如果是增加岭妖、修改反璃、刪除數(shù)據(jù),建議使用POST
    
    
      004 iOS中發(fā)送http請求的方案
          4-1 蘋果原生
              NSURLConnection 03年推出的古老技術
              NSURLSession    13年推出iOS7之后淮蜈,以取代NSURLConnection【重點】
              CFNetwork       底層技術、C語言的
    
          4-2 第三方框架
              ASIHttpRequest
              AFNetworking        【重點】
              MKNetworkKit
    
      005 http請求通信過程
          5-1 請求
              【包括請求頭+請求體·非必選】
          5-2 響應
              【響應頭+響應體】
          5-3 通信過程
              a.發(fā)送請求的時候把請求頭和請求體(請求體是非必須的)包裝成一個請求對象
              b.服務器端對請求進行響應蜻韭,在響應信息中包含響應頭和響應體柿扣,響應信息是對服務器端的描述,具體的信息放在響應體中傳遞給客戶端
          5-4 狀態(tài)碼
              【200】:請求成功
              【400】:客戶端請求的語法錯誤俯画,服務器無法解析
              【404】:無法找到資源
              【500】:服務器內(nèi)部錯誤司草,無法完成請求
    

2.NSURLConnection使用

  • 2.1 NSURLConnection同步請求(GET)

(1)步驟

    01 設置請求路徑
    02 創(chuàng)建請求對象(默認是GET請求泡仗,且已經(jīng)默認包含了請求頭)
    03 使用NSURLSession sendsync方法發(fā)送網(wǎng)絡請求
    04 接收到服務器的響應后猜憎,解析響應體

(2)相關代碼

//1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=nume&pwd=key&type=XML"];
//    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];

    //2.創(chuàng)建一個請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.把請求發(fā)送給服務器
    //sendSynchronousRequest  阻塞式的方法,會卡住線程

    NSHTTPURLResponse *response = nil;
    NSError *error = nil;

    /*
     第一個參數(shù):請求對象
     第二個參數(shù):響應頭信息截亦,當該方法執(zhí)行完畢之后柬讨,該參數(shù)被賦值
     第三個參數(shù):錯誤信息,如果請求失敗却桶,則error有值
     */
     //該方法是阻塞式的蔗牡,會卡住線程
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    //4.解析服務器返回的數(shù)據(jù)
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

  • 2.2 NSURLConnection異步請求(GET-SendAsync)

(1)相關說明

01 該方法不會卡住當前線程,網(wǎng)絡請求任務是異步執(zhí)行的

(2)相關代碼

//1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=nume&pwd=key"];

    //2.創(chuàng)建一個請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.把請求發(fā)送給服務器,發(fā)送一個異步請求
    /*
     第一個參數(shù):請求對象
     第二個參數(shù):回調(diào)方法在哪個線程中執(zhí)行蛋逾,如果是主隊列則block在主線程中執(zhí)行窗悯,非主隊列則在子線程中執(zhí)行
     第三個參數(shù):completionHandlerBlock塊:接受到響應的時候執(zhí)行該block中的代碼
        response:響應頭信息
        data:響應體
        connectionError:錯誤信息蒋院,如果請求失敗,那么該參數(shù)有值
     */
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {

        //4.解析服務器返回的數(shù)據(jù)
        NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        //轉換并打印響應頭信息
        NSHTTPURLResponse *r = (NSHTTPURLResponse *)response;
        NSLog(@"--%zd---%@--",r.statusCode,r.allHeaderFields);
    }];

  • 2.3 NSURLConnection異步請求(GET-代理)

(1)步驟

01 確定請求路徑
02 創(chuàng)建請求對象
03 創(chuàng)建NSURLConnection對象并設置代理
04 遵守NSURLConnectionDataDelegate協(xié)議欺旧,并實現(xiàn)相應的代理方法
05 在代理方法中監(jiān)聽網(wǎng)絡請求的響應

(2)設置代理的幾種方法

/*
     設置代理的第一種方式:自動發(fā)送網(wǎng)絡請求
     [[NSURLConnection alloc]initWithRequest:request delegate:self];
     */

    /*
     設置代理的第二種方式:
     第一個參數(shù):請求對象
     第二個參數(shù):誰成為NSURLConnetion對象的代理
     第三個參數(shù):是否馬上發(fā)送網(wǎng)絡請求辞友,如果該值為YES則立刻發(fā)送栅哀,如果為NO則不會發(fā)送網(wǎng)路請求
     NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];

     //調(diào)用該方法控制網(wǎng)絡請求的發(fā)送
     [conn start];
     */

    //設置代理的第三種方式:使用類方法設置代理留拾,會自動發(fā)送網(wǎng)絡請求
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    //取消網(wǎng)絡請求
    //[conn cancel];

(3)相關的代理方法

/*
 1.當接收到服務器響應的時候調(diào)用
 第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
 第二個參數(shù)response:接收到的服務器返回的響應頭信息
 */
- (void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response

/*
 2.當接收到數(shù)據(jù)的時候調(diào)用鲫尊,該方法會被調(diào)用多次
 第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
 第二個參數(shù)data:本次接收到的服務端返回的二進制數(shù)據(jù)(可能是片段)
 */
- (void)connection:(nonnull NSURLConnection *)connection didReceiveData:(nonnull NSData *)data
/*

 3.當服務端返回的數(shù)據(jù)接收完畢之后會調(diào)用
 通常在該方法中解析服務器返回的數(shù)據(jù)
 */
-(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection

/*4.當請求錯誤的時候調(diào)用(比如請求超時)
 第一個參數(shù)connection:NSURLConnection對象
 第二個參數(shù):網(wǎng)絡請求的錯誤信息,如果請求失敗咳蔚,則error有值
 */
- (void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnull NSError *)error
  • 2.4 NSURLConnection發(fā)送POST請求

(1)發(fā)送POST請求步驟

a.確定URL路徑
b.創(chuàng)建請求對象(可變對象)
c.修改請求對象的方法為POST,設置請求體(Data)
d.發(fā)送一個異步請求
e.補充:設置請求超時侈询,處理錯誤信息堆巧,設置請求頭(如獲取客戶端的版本等等,請求頭是可設置可不設置的)

(2)相關代碼

 //1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];

    //2.創(chuàng)建請求對象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //2.1更改請求方法
    request.HTTPMethod = @"POST";

    //2.2設置請求體
    request.HTTPBody = [@"username=nume&pwd=key" dataUsingEncoding:NSUTF8StringEncoding];

    //2.3請求超時
    request.timeoutInterval = 5;

    //2.4設置請求頭
    [request setValue:@"ios 9.0" forHTTPHeaderField:@"User-Agent"];


    //3.發(fā)送請求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {

        //4.解析服務器返回的數(shù)據(jù)
        if (connectionError) {
            NSLog(@"--請求失敗-");
        }else
        {
            NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
        }

    }];
  • 2.5 URL中文轉碼問題
   //1.確定請求路徑

    NSString *urlStr = @"http://120.25.226.186:32812/login2?username=用戶名&pwd=key";
    NSLog(@"%@",urlStr);
    //中文轉碼操作
    urlStr =  [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"%@",urlStr);

    NSURL *url = [NSURL URLWithString:urlStr];
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谍肤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子荒揣,更是在濱河造成了極大的恐慌,老刑警劉巖恳蹲,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俩滥,死亡現(xiàn)場離奇詭異,居然都是意外死亡错忱,警方通過查閱死者的電腦和手機挂据,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掷倔,“玉大人,你說我怎么就攤上這事勒葱“褪粒” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵涩维,是天一觀的道長。 經(jīng)常有香客問我蜗侈,道長,這世上最難降的妖魔是什么踏幻? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任该面,我火速辦了婚禮信卡,結果婚禮上,老公的妹妹穿的比我還像新娘傍菇。我一直安慰自己丢习,他們只是感情好牵触,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布揽思。 她就那樣靜靜地躺著见擦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儡湾。 梳的紋絲不亂的頭發(fā)上执俩,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天役首,我揣著相機與錄音显拜,去河邊找鬼。 笑死远荠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的盹兢。 我是一名探鬼主播守伸,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼见芹!你這毒婦竟也來了蠢涝?” 一聲冷哼從身側響起和二,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎儿咱,沒想到半個月后混埠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡揭北,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年搔体,在試婚紗的時候發(fā)現(xiàn)自己被綠了半醉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩多。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梁钾,靈堂內(nèi)的尸體忽然破棺而出姆泻,到底是詐尸還是另有隱情,我是刑警寧澤蛾娶,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布潜秋,位于F島的核電站峻呛,受9級特大地震影響钩述,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牙勘,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一放钦、第九天 我趴在偏房一處隱蔽的房頂上張望恭金。 院中可真熱鬧,春花似錦横腿、人聲如沸揪惦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榜苫。三九已至垂睬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钳枕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工赏壹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鱼炒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓蝌借,卻偏偏與公主長得像昔瞧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菩佑,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理自晰,服務發(fā)現(xiàn),斷路器稍坯,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • iOS開發(fā)系列--網(wǎng)絡開發(fā) 概覽 大部分應用程序都或多或少會牽扯到網(wǎng)絡開發(fā)酬荞,例如說新浪微博、微信等瞧哟,這些應用本身可...
    lichengjin閱讀 3,661評論 2 7
  • iOS網(wǎng)絡編程讀書筆記 Facade Tester客戶端門面模式的實例(被動版本化) 被動版本化混巧,所以硬編碼URL...
    melouverrr閱讀 1,606評論 3 7
  • 一. 網(wǎng)絡編程基礎 在移動互聯(lián)網(wǎng)時代,幾乎所有應用都需要用到網(wǎng)絡勤揩,只有通過網(wǎng)絡跟外界進行數(shù)據(jù)交互牲剃、數(shù)據(jù)更新,應用才...
    xx_cc閱讀 19,776評論 12 162
  • 前言 簡單介紹: // OSI(開放式系統(tǒng)互聯(lián)), 由ISO(國際化標準組織)制定 // 1. 應用層 // 2....
    GitHubPorter閱讀 1,239評論 2 4