全部信息明文传播,带来了三大风险: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]; }