iOS 之數(shù)據(jù)請求

一. HTTP和HTTPS協(xié)議

URL:Uniform Resource Locator (統(tǒng)一資源定位符)通過1個URL,能找到互聯(lián)網(wǎng)上唯一的1個資源.
URL就是資源的地址,位置,互聯(lián)網(wǎng)上的每個資源都有一個唯一的URL
URL的基本格式=協(xié)議://主機地址/路徑
不同的協(xié)議,代表著不同的資源查找方式,資源傳輸方式.

  • HTTP協(xié)議

HTTP:Hyper Text Transfer Protocol (超文本傳輸協(xié)議),HTTP是一個應(yīng)用層協(xié)議,由請求和響應(yīng)構(gòu)成,是一個標準的客戶端服務(wù)器模型.

  • HTTPS協(xié)議

HTTPS:Secure Hypertext Transfer Protocol (安全超文本傳輸協(xié)議),HTTPS是一個安全通信通道,基于HTTP開發(fā),用于在客戶計算機和服務(wù)器之間交換信息.使用安全套接字層(SSL)進行信息交換,簡答來說它是HTTP的安全版.HTTPS協(xié)議使用SSL在發(fā)送方把原始數(shù)據(jù)進行了加密過程,然后在接收方進行解密,加密和解密的過程需要發(fā)送方和接收方通過交換共知的密鑰完成.所以傳輸?shù)木W(wǎng)絡(luò)數(shù)據(jù)不會被黑客截獲和解密.

  • HTTP和HTTPS的異同

HTTPS協(xié)議需要的CA申請證書,一般免費證書很少,收費.
HTTP是超文本傳輸協(xié)議,信息是明文傳輸,HTTPS則是具有安全性SSL加密的傳輸協(xié)議.
HTTP和HTTPS是用的是完全不同的鏈接方式,用的端口也不同,前者是80,后者是443
HTTP的鏈接很簡單,是無狀態(tài)的.
HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)成的可以進行加密傳輸,身份認證的網(wǎng)絡(luò)協(xié)議 要比HTTP安全.

二. HTTP協(xié)議的常見的請求方式

  • GET與POST

GET
POST
都能給服務(wù)器傳輸數(shù)據(jù)

  • GET與POST的區(qū)別

不同點:

  1. 給服務(wù)器傳輸數(shù)據(jù)的方式不同:GET:通過網(wǎng)址字符串傳輸 POST:同data傳輸
  2. 傳輸數(shù)據(jù)的大小:GET:網(wǎng)址字符串最多255字節(jié) POST:使用NSData,容量無上限.
  3. 安全性: GET:所傳輸給服務(wù)的數(shù)據(jù),顯示在網(wǎng)址內(nèi),類似于密碼的明文輸入,直接可見. POST:數(shù)據(jù)被轉(zhuǎn)成NSData(二進制數(shù)據(jù)),類似于密碼輸入,無法直接讀取.

三. iOS實現(xiàn)網(wǎng)絡(luò)編程

  • HTTP協(xié)議如何實現(xiàn)請求數(shù)據(jù)
    網(wǎng)絡(luò)請求對象NSURLRequest,NSMutableURLRequest
    網(wǎng)絡(luò)鏈接短信NSURLConnection的作用及其用法
    網(wǎng)絡(luò)鏈接協(xié)議NSURLCOnnectionDelegate

  • HTTP連接方式
    同步連接:程序容易出現(xiàn)卡死現(xiàn)象
    異步連接:等待數(shù)據(jù)返回
    異步連接有兩種實現(xiàn)方式:

  1. 設(shè)置代理,接收數(shù)據(jù).
  2. 實現(xiàn)Block

同步GET請求

- (void)synchronousGetRequest {

    // 1.url地址
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    NSURL *url = [NSURL URLWithString:urlStr];
    // 2.創(chuàng)建網(wǎng)絡(luò)請求對象
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    
    // 3.獲取服務(wù)器請求得到的數(shù)據(jù)
    NSData *receivedData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    // 4.解析data
    if (receivedData) {
        NSLog(@"得到數(shù)據(jù)");
        NSString *receivedStr = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
        NSLog(@"%@",receivedStr);
    } else {
        NSLog(@"未獲取數(shù)據(jù)");
    }
}

異步GET請求Block模式

- (void)aSyschronousGetRequest {
    // 1.地址url
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    NSURL *url = [NSURL URLWithString:urlStr];
    // 2.請求對象
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    // 3.連接并獲取數(shù)據(jù)
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        
        if (connectionError) {
            NSLog(@"連接獲取數(shù)據(jù)失敗----%@",connectionError.description);
        } else {
            NSLog(@"連接獲取數(shù)據(jù)成功!");
            NSString *receivedDataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",receivedDataStr);
        }
    }];
    NSLog(@"異步獲取數(shù)據(jù),不影響其他代碼執(zhí)行!");
}

同步POST請求

- (void)synchronousPostRequest {
    // 1.地址url
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
    NSURL *url = [NSURL URLWithString:urlStr];
    // date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213
    // 2.請求對象
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    // 3.設(shè)置請求方法
    request.HTTPMethod = @"POST";
    // 4.參數(shù)轉(zhuǎn)換成為字符串
    NSString *dataStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
    // 5.加載參數(shù)
    request.HTTPBody = data;
    // 6.連接
    NSData *dataPost = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    // 7.判斷是否成功并輸出
    if (dataPost) {
        NSLog(@"獲取數(shù)據(jù)成功!");
        NSString *dataPostStr = [[NSString alloc] initWithData:dataPost encoding:NSUTF8StringEncoding];
        NSLog(@"%@",dataPostStr);
    } else {
        NSLog(@"獲取數(shù)據(jù)失敗!");
    }
}

異步POST請求Block模式

- (void)aSynchronousPostRequest {

    // 1.地址url
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
    NSURL *url = [NSURL URLWithString:urlStr];
    // date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213
    // 2.請求對象
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    // 3.設(shè)置請求方法
    request.HTTPMethod = @"POST";
    // 4.參數(shù)轉(zhuǎn)換成為字符串
    NSString *dataStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
    // 5.加載參數(shù)
    request.HTTPBody = data;
    // 6.連接獲取數(shù)據(jù)
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        if (connectionError) {
            NSLog(@"獲取數(shù)據(jù)失敗----%@",connectionError.description);
        } else {
            NSLog(@"獲取數(shù)據(jù)成功!");
            NSString *dataPostStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",dataPostStr);
        }
    }];
    NSLog(@"異步獲取數(shù)據(jù)!");
}

異步POST請求Delegate模式

異步POST請求現(xiàn)如今使用的非常少,通過代理時間進行驅(qū)動
NSURLConnectionDataDelegate與NSURLConnectionDelegate兩個協(xié)議代理進行.

四. iOS7之后請求變化

在WWDC 2013中,Apple的團隊對NSURLConnection進行了重構(gòu),并推出了NSURLSession作為替代.
支持后臺運行的網(wǎng)絡(luò)任務(wù).
暫停,停止,重啟網(wǎng)絡(luò)任務(wù),不再需要NSOpation封裝
請求可以使用同樣的適配容器
不同的session可以使用不同的私有存儲,block和協(xié)議可以同時起作用.
所有的任務(wù)默認是掛起的,需要Resume進行開始.

NSURLSession的工作模式:

1.模式會話模式
2.瞬時會話模式
3.后臺會話模式

  • Session的GET請求
- (void)sessionGetRequest {
    // 1.獲取url
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    NSURL *url = [NSURL URLWithString:urlStr];
    // 2.創(chuàng)建session對象
    NSURLSession *session = [NSURLSession sharedSession];
    // 3.連接請求數(shù)據(jù)
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@"請求數(shù)據(jù)失敗!---------%@",error.description);
        } else {
            NSLog(@"請求數(shù)據(jù)成功!");
            NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",dataStr);
        }
    }];
    // 4.啟動請求
    [dataTask resume];
    NSLog(@"請求數(shù)據(jù)開始!");
}
  • Session的POST請求
- (void)sessionPostRequest {
    // 1.獲取url
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
    NSURL *url = [NSURL URLWithString:urlStr];
    // 2.創(chuàng)建session對象
    NSURLSession *session = [NSURLSession sharedSession];
    // 3.創(chuàng)建請求對象
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    // 4.設(shè)置請求方式與參數(shù)
    request.HTTPMethod = @"POST";
    NSString *dataStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPBody = data;
    // 5.進行鏈接請求數(shù)據(jù)
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@"請求數(shù)據(jù)出錯!----%@",error.description);
        } else {
            NSLog(@"請求數(shù)據(jù)成功!");
            NSString *dataPostStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",dataPostStr);
        }
    }];
    // 6.開啟請求數(shù)據(jù)
    [dataTask resume];
    NSLog(@"session post request!");
    //date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213
}
  • Session的下載
- (void)sessionDownload {
    // 1.獲取url
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
    NSURL *url = [NSURL URLWithString:urlStr];
    // 2.創(chuàng)建session對象
    NSURLSession *session = [NSURLSession sharedSession];
    // 3.創(chuàng)建請求對象
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    // 4.設(shè)置請求方式與參數(shù)
    request.HTTPMethod = @"POST";
    NSString *dataStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPBody = data;
    // 5.進行下載
    NSURLSessionDownloadTask *downLoadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 這里的location就是下載臨時文件路徑
        // 使用NSFileManager的實例化對象可以對文件進行操作
        if (error) {
            NSLog(@"下載失敗------%@",error.description);
        } else {
            NSLog(@"下載成功!");
            NSFileManager *fileManager = [NSFileManager defaultManager];
            NSURL *targetUrl = [NSURL fileURLWithPath:@"(設(shè)置保存文件的地址)"];
            // 將文件移動到指定的路徑
            [fileManager copyItemAtURL:location toURL:targetUrl error:nil];
        }
    }];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(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
  • 正文 為了忘掉前任蝗锥,我火速辦了婚禮,結(jié)果婚禮上率触,老公的妹妹穿的比我還像新娘终议。我一直安慰自己,他們只是感情好葱蝗,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布穴张。 她就那樣靜靜地躺著,像睡著了一般两曼。 火紅的嫁衣襯著肌膚如雪皂甘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天悼凑,我揣著相機與錄音叮贩,去河邊找鬼击狮。 笑死,一個胖子當著我的面吹牛益老,可吹牛的內(nèi)容都是我干的彪蓬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捺萌,長吁一口氣:“原來是場噩夢啊……” “哼档冬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桃纯,我...
    開封第一講書人閱讀 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)自己被綠了玫氢。 大學(xué)時的朋友給我發(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ā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理步鉴,服務(wù)發(fā)現(xiàn)困曙,斷路器,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評論 25 707
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,983評論 6 13
  • URL:就是資源的地址熟尉、位置慷荔,每一個互聯(lián)網(wǎng)資源都有一個唯一的URL耗跛。HTTP協(xié)議:Hyper Text Trans...
    Zzzzzzz7閱讀 375評論 0 1
  • 文/孤獨客 很久之前讀了張嘉佳的作品《從你的全世界路過》菊碟,那時候只是簡單的讀了一下节芥,沒有什么心得,最近看了由這本書...
    EulerSpace閱讀 253評論 0 0