iOS 原生網(wǎng)絡(luò)請(qǐng)求 NSURLSession 和 NSMutableURLRequest應(yīng)用示例

大部分的iOS開(kāi)發(fā)在剛開(kāi)始接觸網(wǎng)絡(luò)請(qǐng)求時(shí),應(yīng)該都是用的AFNetworking這個(gè)在iOS界扛把子的框架來(lái)做的吧极舔,但你們知道這個(gè)框架在做網(wǎng)絡(luò)請(qǐng)求的時(shí)候都做了什么嗎偷线。這篇文章會(huì)從系統(tǒng)原生的網(wǎng)絡(luò)請(qǐng)求來(lái)揭示網(wǎng)絡(luò)請(qǐng)求的本質(zhì)幔嗦,以后如果有時(shí)間會(huì)簡(jiǎn)單解析AFNetworking的源碼谒养。

原生網(wǎng)絡(luò)請(qǐng)求分為三個(gè)部分:

  1. NSMutableURLRequest請(qǐng)求類

先來(lái)一張網(wǎng)絡(luò)請(qǐng)求的抓包信息圖:

網(wǎng)絡(luò)請(qǐng)求抓包.png

圖片來(lái)自:編程小翁

上圖便是一個(gè)完整的網(wǎng)絡(luò)請(qǐng)求的抓包示意圖,NSMutableURLRequest這個(gè)類就是管理者上半部分的所有信息身隐,如下圖框出來(lái)的部分:

網(wǎng)絡(luò)請(qǐng)求抓包.png

圖片來(lái)自:編程小翁

其實(shí)就是網(wǎng)絡(luò)請(qǐng)求中的HTTPHeaderField信息廷区。我們來(lái)一一細(xì)說(shuō)其中作用(其中著重看Content-Type、Cookie贾铝、Content-Length隙轻,因?yàn)槲覀兣渲眠@些就行了埠帕。另外還有一個(gè)重要字段圖中沒(méi)有,那就是傳輸?shù)膬?nèi)容HTTPBody代碼中會(huì)講到)玖绿。

POST:這個(gè)可以是GET或者別的請(qǐng)求方式敛瓷,這里放的是URL后半段
Host:這里是主機(jī)地址,Host和POST字段拼接起來(lái)就是一個(gè)完整的URL
Accept:這個(gè)網(wǎng)絡(luò)請(qǐng)求發(fā)送的數(shù)據(jù)的格式說(shuō)明:如Accept:text/html斑匪,這說(shuō)明這個(gè)網(wǎng)絡(luò)請(qǐng)求發(fā)送的
       是HTML格式的數(shù)據(jù)呐籽。圖中的Accept:*/* 為通用格式。
Content-Type:這個(gè)字段表明數(shù)據(jù)發(fā)送方(也就是我們客戶端)想要接收的數(shù)據(jù)格式蚀瘸,一下有一個(gè)格式
       對(duì)照表的截圖狡蝶。
Connection:網(wǎng)絡(luò)請(qǐng)求連接的方式,這個(gè)我們不用設(shè)置贮勃。
Cookie:我們只能從服務(wù)器得到這個(gè)字段贪惹,用于維持服務(wù)端會(huì)話狀態(tài),也可以用來(lái)做接口驗(yàn)證寂嘉,類似
        token這樣的奏瞬。并且在iOS中,如果請(qǐng)求中cookie字段有值泉孩,蘋(píng)果會(huì)自動(dòng)幫我們保存下來(lái)丝格,
        代碼中會(huì)講。
Accept-Language:表明可以接收什么文字棵譬,zh-cn表示中文。
Content-Length:表示傳輸內(nèi)容的長(zhǎng)度预伺。
Accept-Encoding:表示客戶端支持的編碼格式订咸,這個(gè)不用我們配置。
User-Agent:這個(gè)就像是一個(gè)網(wǎng)名酬诀,隨便寫(xiě)都可以脏嚷,一般不做配置。

創(chuàng)建一個(gè)NSMutableURLRequest

/** 創(chuàng)建request對(duì)象 */
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
    
    /** 這個(gè)操作就是檢測(cè)cookie的方法瞒御,我們的系統(tǒng)會(huì)自動(dòng)將cookie保存下來(lái)父叙,通過(guò)下面的方法可以檢測(cè)出來(lái),如果服務(wù)器要求我們同步cookie肴裙,則在request中設(shè)置Cookie的值 */
    NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (NSHTTPCookie *cookie in [cookieJar cookies]) {
        
        if (cookie != nil) {
            NSDictionary *headers=[NSHTTPCookie requestHeaderFieldsWithCookies:[cookieJar cookies]];
            [request setValue:[headers objectForKey:@"Cookie"] forHTTPHeaderField:@"Cookie"];
        }
    }
    
    
    /**
         如果傳入?yún)?shù)不為空趾唱,則為POST請(qǐng)求
         如果傳入的參數(shù)為nil,則為GET請(qǐng)求
     */
    if (parameters != nil && parameters.count > 0) {
        
        /** 傳入的參數(shù)為一個(gè)字典蜻懦,我們需要把字典轉(zhuǎn)化為一個(gè)以"&"分隔的字符串甜癞,再將字符串轉(zhuǎn)化為data,最后設(shè)置到HTTPBody里面去 */
        NSData *bodyData = [self getDataFromParameters:parameters];
        
        [request setHTTPMethod:@"POST"];
        [request setHTTPBody:bodyData];
        [request setValue:[NSString stringWithFormat:@"%lld",(long long)bodyData.length] forHTTPHeaderField:@"Content-Length"];
        
        /** 這個(gè)可以固定 */
        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    }
    
    /** 設(shè)置請(qǐng)求時(shí)間 */
    request.timeoutInterval = 8.0;
  1. NSURLSession會(huì)話類
  2. NSURLSessionDataTask會(huì)話任務(wù)類
   把這兩個(gè)放到一起講宛乃,是因?yàn)檫@兩個(gè)很簡(jiǎn)單悠咱。一個(gè)request請(qǐng)求需要一個(gè)會(huì)話來(lái)啟動(dòng)和管理蒸辆,但我們僅僅只需要一個(gè)創(chuàng)建一個(gè)對(duì)象就行了
    /** 創(chuàng)建會(huì)話對(duì)象 */
    NSURLSession *session = [NSURLSession sharedSession];

    最后我們需要把會(huì)話對(duì)象用來(lái)創(chuàng)建一個(gè)任務(wù)對(duì)象就完成了:
    /** 創(chuàng)建會(huì)話任務(wù),并用會(huì)話對(duì)象啟動(dòng)請(qǐng)求對(duì)象 */
    NSURLSessionDataTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    }];

    注意一點(diǎn):會(huì)話任務(wù)需要手動(dòng)啟動(dòng)
    /** 開(kāi)始任務(wù) */
    [sessionDataTask resume];

至此析既,系統(tǒng)原生的網(wǎng)絡(luò)請(qǐng)求就完成了躬贡。
demo地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眼坏,隨后出現(xiàn)的幾起案子拂玻,更是在濱河造成了極大的恐慌,老刑警劉巖空骚,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纺讲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡囤屹,警方通過(guò)查閱死者的電腦和手機(jī)熬甚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肋坚,“玉大人乡括,你說(shuō)我怎么就攤上這事≈茄幔” “怎么了诲泌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)铣鹏。 經(jīng)常有香客問(wèn)我敷扫,道長(zhǎng),這世上最難降的妖魔是什么诚卸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任葵第,我火速辦了婚禮,結(jié)果婚禮上合溺,老公的妹妹穿的比我還像新娘卒密。我一直安慰自己,他們只是感情好棠赛,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布哮奇。 她就那樣靜靜地躺著,像睡著了一般睛约。 火紅的嫁衣襯著肌膚如雪鼎俘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天辩涝,我揣著相機(jī)與錄音而芥,去河邊找鬼。 笑死膀值,一個(gè)胖子當(dāng)著我的面吹牛棍丐,可吹牛的內(nèi)容都是我干的误辑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼歌逢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼巾钉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起秘案,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤砰苍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后阱高,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赚导,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年赤惊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吼旧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡未舟,死狀恐怖圈暗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裕膀,我是刑警寧澤员串,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站昼扛,受9級(jí)特大地震影響寸齐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抄谐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一渺鹦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斯稳,春花似錦、人聲如沸迹恐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)殴边。三九已至憎茂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锤岸,已是汗流浹背竖幔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留是偷,地道東北人拳氢。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓募逞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親馋评。 傳聞我的和親對(duì)象是個(gè)殘疾皇子放接,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • iOS開(kāi)發(fā)系列--網(wǎng)絡(luò)開(kāi)發(fā) 概覽 大部分應(yīng)用程序都或多或少會(huì)牽扯到網(wǎng)絡(luò)開(kāi)發(fā),例如說(shuō)新浪微博留特、微信等纠脾,這些應(yīng)用本身可...
    lichengjin閱讀 3,641評(píng)論 2 7
  • 閱讀目錄 一、整體介紹 二蜕青、使用的一般步驟 三 舉例 四 NSURLSessionConfiguration 附錄...
    九洲仙人閱讀 821評(píng)論 1 3
  • 一苟蹈、關(guān)于老師或書(shū)籍 1、必須知道的常識(shí):法律碩士非法學(xué)共考三大門(mén)科目右核,專業(yè)課慧脱、英語(yǔ)一、政治蒙兰。專業(yè)課又分為民法(75...
    潘慧_06b3閱讀 297評(píng)論 0 1
  • 三月上里搜变。 微涼有風(fēng)采缚。 桃蕊含蕾。 幾點(diǎn)淺思化春風(fēng)挠他,寄予桃花箋扳抽? 是三月的春風(fēng)揭開(kāi)了上里的春帷,是上里的茶馬古道傳...
    余尚義閱讀 720評(píng)論 1 4
  • (六)“美麗”的服裝 “天哪殖侵!”我一邊欣賞著珍奇精心設(shè)計(jì)的的服裝贸呢,一邊贊美著那閃閃發(fā)光的用料和精細(xì)的做工。珍...
    友誼精靈閱讀 330評(píng)論 0 5