不使用SSL/TLS的HTTP通信,就是不加密的通信!
所有信息明文传播,带来了三大风险:
窃听风险(eavesdropping):第三方可以获知通信内容。
篡改风险(tampering):第三方可以修改通信内容。
冒充风险(pretending):第三方可以冒充他人身份参与通信。
SSL/TLS协议是为了解决这三大风险而设计的,希望达到:
所有信息都是加密传播,第三方无法窃听。
具有校验机制,一旦被篡改,通信双方会立刻发现。
配备身份证书,防止身份被冒充。
HTTP协议的使用
1.请求:客户端向服务器索要数据.
http协议规定:一个完整的http请求包含** '请求行 ', '请求头' , '请求体' **三个部分;
请求行:包含了请求方法,请求资源路径,http协议版本. "GET /resources/images/ HTTP/1.1"
请求头:包含了对客户端的环境描述,客户端请求的主机地址等信息.
请求体:客户端发给服务器的具体数据,比如文件/图片等.
2.响应:服务器返回客户端想要的数据
http协议规定:一个完整的http响应包含'状态行','响应头','实体内容'三个部分;
状态行:包含了http协议版本,状态吗,状态英文名称.
响应头:包含了对服务器的描述,对返回数据的描述.
实体内容:服务器返回给客户端的具体数据(图片/html/文件...).
3. 在iOS开发中,发送http请求的方案有很多,常见的有如下几种:
苹果原生:
1).NSURLConnection:用法简单,古老经典的一种方案.
2).NSURLSession:iOS7以后推出的技术,功能NSURLConnection更加强大.
3).CFNetWork: NSURL的底层,纯C语言,一般不用.
1). NSURLConnection
//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;
2).NSURLSession
// 1、在info.plist文件中添加row
app row -> app Transport Security Settings (展开) -> Allow Arbirary Loads (string -> Yes)(允许http请求)
//2、图片下载
- (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];
}
http的get与post
1. 区别:
GET: 默认方式,请求方式放在请求地址的后面通过?分割,多个参数通过&分割,通常从服务器要数据用get
POST: 把请求参数放到请求体里面,通常給服务器传数据的时候用到post
2. 注意:
建议:提交用户的隐私数据一定要使用POST请求
相对POST请求而言,GET请求的所有参数都直接暴露在URL中,请求的URL一般会记录在服务器的访问日志中,而服务器的访问日志是黑客攻击的重点对象之一
用户的隐私数据如登录密码,银行账号等。
1).get请求:
- (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];
}