全部信息明文傳播,帶來了三大風險:php
竊聽風險(eavesdropping):第三方能夠獲知通訊內容。html
篡改風險(tampering):第三方能夠修改通訊內容。ios
冒充風險(pretending):第三方能夠冒充他人身份參與通訊。json
SSL/TLS協議是爲了解決這三大風險而設計的,但願達到:
全部信息都是加密傳播,第三方沒法竊聽。
具備校驗機制,一旦被篡改,通訊雙方會馬上發現。
配備身份證書,防止身份被冒充。api
http協議規定:一個完整的http請求包含** '請求行 ', '請求頭' , '請求體' **三個部分;服務器
請求行:包含了請求方法,請求資源路徑,http協議版本. "GET /resources/images/ HTTP/1.1"網絡
請求頭:包含了對客戶端的環境描述,客戶端請求的主機地址等信息.session
請求體:客戶端發給服務器的具體數據,好比文件/圖片等.app
http協議規定:一個完整的http響應包含'狀態行','響應頭','實體內容'三個部分;post
狀態行:包含了http協議版本,狀態嗎,狀態英文名稱.
響應頭:包含了對服務器的描述,對返回數據的描述.
實體內容:服務器返回給客戶端的具體數據(圖片/html/文件...).
蘋果原生:
1).NSURLConnection:用法簡單,古老經典的一種方案.
2).NSURLSession:iOS7之後推出的技術,功能NSURLConnection更增強大.
3).CFNetWork: NSURL的底層,純C語言,通常不用.
//NSURL 標識資源位置 //NSURLRequest 標識網絡請求內容 //NSURLConnection 標識與客戶端與服務器創建的網絡鏈接 //NSURLResponse 標識服務器給客戶端的響應結果 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ //respond 回來的結果:status code: 200 ->表示請求成功 , 404->找不到服務器 NSLog(@"%@", response); } //設置代理 //遵照協議 NSURLConnectionDataDelegate(設置代理) //網絡請求的響應結果 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; //用來接收響應數據 屢次調用(分段返回) - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;//不全 //網絡請求結束 - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
// 一、在info.plist文件中添加row app row -> app Transport Security Settings (展開) -> Allow Arbirary Loads (string -> Yes)(容許http請求) //二、圖片下載 - (void)viewDidLoad { [super viewDidLoad]; //圖片下載路徑 NSString *path = @"http://pic2.desk.chinaz.com/file/10.03.10/5/rrgaos36.jpg"; //下載請求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:path]]; //建立默認會話配置對象 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; // 後面隊列的做用 若是給子線程隊列則協議方法在子線程中執行 給主線程隊列就在主線程中執行 NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; //主線程中執行 NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request]; [task resume]; }
1. 區別:
GET: 默認方式,請求方式放在請求地址的後面經過?分割,多個參數經過&分割,一般從服務器要數據用get
POST: 把請求參數放到請求體裏面,一般給服務器傳數據的時候用到post
建議:提交用戶的隱私數據必定要使用POST請求
相對POST請求而言,GET請求的全部參數都直接暴露在URL中,請求的URL通常會記錄在服務器的訪問日誌中,而服務器的訪問日誌是黑客攻擊的重點對象之一
用戶的隱私數據如登陸密碼,銀行帳號等。
- (void)viewDidLoad { [super viewDidLoad]; //請求路徑 NSString *path = @"http://apis.juhe.cn/mobile/get?phone=18888888888&key=4e602dad4a05b4d491ffb82511613158"; NSURL *url = [NSURL URLWithString:path]; //建立請求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //建立網絡會話對象 NSURLSession *session = [NSURLSession sharedSession]; //建立數據任務 NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //data爲服務器返回的數據 // NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; // NSLog(@"%@",string); //把服務器返回的json數據 直接轉成字典 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSDictionary *resultDic = dic[@"result"]; NSString *province = resultDic[@"province"]; NSString *city = resultDic[@"city"]; NSString *company = resultDic[@"company"]; NSLog(@"%@省 %@市 %@",province,city,company); }]; //開始任務 [dataTask resume]; }``` ######2).post請求: ``` - (void)viewDidLoad { [super viewDidLoad]; //請求的數據不在path裏面 NSString *path = @"http://v.juhe.cn/joke/randJoke.php"; NSURL *url = [NSURL URLWithString:path]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //設置請求方式爲POST,請求內容寫在body裏面 [request setHTTPMethod:@"POST"]; [request setHTTPBody:[@"key=8d0bde7167db666ac160191217840b5b&type=pic" dataUsingEncoding:NSUTF8StringEncoding]]; NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"%@",dic); }]; //開始請求 [task resume]; }