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是一個應用層協(xié)議,由請求和響應構(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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,124評論 25 708
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,132評論 6 13
  • URL:就是資源的地址、位置,每一個互聯(lián)網(wǎng)資源都有一個唯一的URL。HTTP協(xié)議:Hyper Text Trans...
    Zzzzzzz7閱讀 384評論 0 1
  • 文/孤獨客 很久之前讀了張嘉佳的作品《從你的全世界路過》,那時候只是簡單的讀了一下,沒有什么心得,最近看了由這本書...
    EulerSpace閱讀 269評論 0 0