一. 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ū)別
不同點:
- 給服務(wù)器傳輸數(shù)據(jù)的方式不同:GET:通過網(wǎng)址字符串傳輸 POST:同data傳輸
- 傳輸數(shù)據(jù)的大小:GET:網(wǎng)址字符串最多255字節(jié) POST:使用NSData,容量無上限.
- 安全性: 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é)議NSURLCOnnectionDelegateHTTP連接方式
同步連接:程序容易出現(xiàn)卡死現(xiàn)象
異步連接:等待數(shù)據(jù)返回
異步連接有兩種實現(xiàn)方式:
- 設(shè)置代理,接收數(shù)據(jù).
- 實現(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];
}
}];
}