iOS開發網絡多線程之網絡

網絡day01

理論部分

1.GET請求和POST請求總結:

GET:在請求URL后面以?的形式跟上發給服務器的參數,多個參數之間用&隔開

例:http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON

  • "協議頭+主機地址+端口號+接口名稱+?+參數1&參數&參數3"

使用場景:當只需要進行簡單索數據,建議使用GET


POST:發給服務器的參數全部放在請求體中,理論上,POST傳遞的數據量沒有限制(具體還得看服務器的處理能力)

例:http://120.25.226.186:32812/login

  • "協議頭+主機地址+端口號+接口名稱"

使用場景:

1.需要傳遞大量的數據(數據上傳)只能使用POST

2.GET的安全性比POST差,故當需要傳遞安全程度需要高的數據時,使用POST

3.如果需要增加\刪除\修改數據時,建議使用POST


2.發送GET請求的步驟

1)確定請求路徑("后面跟參數")

2)創建請求對象(默認就是GET請求)

3)使用NSURLConnection發送請求

4)解析服務器返回的數據

3.發送POST請求的步驟

1)確定請求路徑(后面不跟參數)

2)創建"可變的"請求對象

3)修改請求對象的請求方法為POST

4)設置請求體(把參數轉換為二進制數據設置)

5)使用NSURLConnection發送請求

6)解析服務器返回的數據


4.http請求通信過程

(1)請求:【包括請求頭+請求體·非必選】

(2)響應:【響應頭+響應體】

(3)通信過程:

a.發送請求的時候把請求頭和請求體(請求體是非必須的)包裝成一個請求對象

b.服務器端對請求進行響應,在響應信息中包含響應頭和響應體,響應信息是對服務器端的描述,具體的信息放在響應體中傳遞給客戶端

代碼部分:

一.NSURLConnection的實現
  • 1.NSURLConnection發送GET請求(同步請求)

    //1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520&pwd=520&type=JSON"];
    //2.創建請求對象
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
    
    //3.使用NSURLConnection來發送網絡請求(同步請求-阻塞)
    NSURLResponse *response = nil;
    NSError *error = nil;//通常定義NSError不使用alloc init的方式
    /*
     第一個參數:sendSynchronousRequest-->請求對象
     第二個參數:returningResponse-->響應頭信息 傳地址
     第三個參數:error-->錯誤信息
     返回值:響應體信息(解析)
     */
    NSData *data =  [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    
    NSLog(@"%@---%@",response,error);
    
    //4.解析服務器返回的數據
    NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
  • 2.NSURLConnection發送GET請求(異步請求)

    //1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520&pwd=520&type=JSON"];
    //2.創建請求對象
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
    
    //3.發送異步請求
    /*
     第一個參數:請求對象
     第二個參數:隊列(決定代碼塊在哪個線程中調用)
     第三個參數:completionHandler 網絡請求完成(成功|失敗)之后的回調
              NSURLResponse:響應頭
              data:響應體
              connectionError:錯誤信息
     */
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
       
        //先判斷請求是否成功
        if (connectionError) {
            NSLog(@"請求失敗---%@",connectionError);
            return ;
        }
        
        //4.解析數據
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
        NSLog(@"%@",response);
    }];
    
    NSLog(@"--end---");//因為是異步的關系,導致這句話到時可能優先打印

  • 3.NSURLConnection發送GET請求(代理方法)

    //1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520&pwd=520&type=JSON"];
    
    //2.創建請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    //3.設置代理,發送網絡請求
    //第一種設置代理的方法
    [[NSURLConnection alloc]initWithRequest:request delegate:self];
    
    //第二種設置代理的方法
    //startImmediately是否馬上發送網絡請求 YES(馬上發送)
    NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
    //若為NO,則需要調用發送請求的方法
    //發送網絡請求
    [connect start];
    
    
//并實現下列代理方法:

//接收到服務器的響應
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

//當接收到服務器返回的數據的時候調用(可能會被調用多次)
//P.S.定義一個成員屬性保存已經獲取獲取的Data,并將獲得的所有data拼接在一起
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

//當請求完成的時候調用
//輸出響應體,使用[[NSString alloc]initWithData:self.resultData encoding:NSUTF8StringEncoding]方式輸出
-(void)connectionDidFinishLoading:(NSURLConnection *)connection

//當請求失敗或者是出現錯誤的時候調用
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
  • 4.NSURLConnection發送POST請求
  //1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
    
    //2.創建可變的請求對象(需要使用可變類型,因為默認不可變請求方法為GET)
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    //3.**修改請求方法POST(大寫)**
    request.HTTPMethod = @"POST";
    
    //設置請求對象
    //請求超時 --- 設置一個請求的時間限制,如果超過這個時間那么就認為請求失敗
    request.timeoutInterval = 15;
    //設置請求頭
    [request setValue:@"iOS 10.1" forHTTPHeaderField:@"User-Agent"];
    
    //4.設置請求體
    //username=520it&pwd=520it&type=JSON
    request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
    
    //5.發送網絡請求+接收服務器返回的數據
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) 
    
    /*
   也可使用 NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) 
   
   這樣可以不用創建請求對象
    */
    
        if(connectionError)
        {
            NSLog(@"請求失敗---%@",connectionError);
            return ;
        }
        //6.解析是服務器返回的數據
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];

二.NSURLSession的實現
  • 1.NSURLSession發送GET請求

//1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520&pwd=520&type=JSON"];
    
    //2.創建請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    //3.獲得一個會話對象
    NSURLSession *session = [NSURLSession sharedSession];
    
    //4.創建請求任務
    /*
     第一個參數:請求對象
     第二個參數:completionHandler 完成后執行的回調
            data:響應體
            response:響應頭
            error:錯誤信息
     */
    //!!!注意:默認情況下completionHandler在子線程中調用
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
       
    //6.解析服務器返回的數據
    NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    
    //5.**執行task**需要自己手動開啟
    [dataTask resume];


  • 2.NSURLSession發送POST請求

//1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
    
    //2.創建可變的請求對象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //2.1 修改請求方法
    request.HTTPMethod = @"POST";
    //2.2 設置請求體
    request.HTTPBody = [@"username=520&pwd=520&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
    
    //3.創建會話對象
    NSURLSession *session = [NSURLSession sharedSession];
    
    //4.創建task
   NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
       
       //6.解析數據
       NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    
    //5.執行task
    [dataTask resume];
}
  • 3.NSURLSession發送請求(代理方法)
//1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
    //2.創建會話對象
    /*
     第一個參數:配置選項
     第二個參數:誰成為代理
     第三個參數:隊列(線程) 決定的是代理方法在哪個線程中調用
     */
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
    //3.創建task
    NSURLSessionDataTask *dataTask =  [session dataTaskWithURL:url];
    //4.執行task
    [dataTask resume];

//并實現下列代理方法:

//當接收到服務器響應的時候調用
//默認情況下是不會接收服務器返回數據的,如果需要接收應該主動告訴系統(需要在completionHandler中告知系統)
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler

/*
NSURLSessionResponseCancel = 0,     取消(默認的做法)
NSURLSessionResponseAllow = 1,      允許(接收數據)
*/

//當接收到服務器返回數據的時候調用(會調用多次)
//解決方式和NSURLConnection的代理方式一致
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容