iOS 之数据请求
一. HTTP和HTTPS协议
URL:Uniform Resource Locator (统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源.
URL就是资源的地址,位置,互联网上的每个资源都有一个唯一的URL
URL的基本格式=协议://主机地址/路径
不同的协议,代表着不同的资源查找方式,资源传输方式.
- HTTP协议
HTTP:Hyper Text Transfer Protocol (超文本传输协议),HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型.
- HTTPS协议
HTTPS:Secure Hypertext Transfer Protocol (安全超文本传输协议),HTTPS是一个安全通信通道,基于HTTP开发,用于在客户计算机和服务器之间交换信息.使用安全套接字层(SSL)进行信息交换,简答来说它是HTTP的安全版.HTTPS协议使用SSL在发送方把原始数据进行了加密过程,然后在接收方进行解密,加密和解密的过程需要发送方和接收方通过交换共知的密钥完成.所以传输的网络数据不会被黑客截获和解密.
- HTTP和HTTPS的异同
HTTPS协议需要的CA申请证书,一般免费证书很少,收费.
HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性SSL加密的传输协议.
HTTP和HTTPS是用的是完全不同的链接方式,用的端口也不同,前者是80,后者是443
HTTP的链接很简单,是无状态的.
HTTPS协议是由SSL+HTTP协议构成的可以进行加密传输,身份认证的网络协议 要比HTTP安全.
二. HTTP协议的常见的请求方式
- GET与POST
GET
POST
都能给服务器传输数据
- GET与POST的区别
不同点:
- 给服务器传输数据的方式不同:GET:通过网址字符串传输 POST:同data传输
- 传输数据的大小:GET:网址字符串最多255字节 POST:使用NSData,容量无上限.
- 安全性: GET:所传输给服务的数据,显示在网址内,类似于密码的明文输入,直接可见. POST:数据被转成NSData(二进制数据),类似于密码输入,无法直接读取.
三. iOS实现网络编程
-
HTTP协议如何实现请求数据
网络请求对象NSURLRequest,NSMutableURLRequest
网络链接短信NSURLConnection的作用及其用法
网络链接协议NSURLCOnnectionDelegate -
HTTP连接方式
同步连接:程序容易出现卡死现象
异步连接:等待数据返回
异步连接有两种实现方式:
- 设置代理,接收数据.
- 实现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.创建网络请求对象
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
// 3.获取服务器请求得到的数据
NSData *receivedData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// 4.解析data
if (receivedData) {
NSLog(@"得到数据");
NSString *receivedStr = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
NSLog(@"%@",receivedStr);
} else {
NSLog(@"未获取数据");
}
}
异步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.连接并获取数据
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if (connectionError) {
NSLog(@"连接获取数据失败----%@",connectionError.description);
} else {
NSLog(@"连接获取数据成功!");
NSString *receivedDataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",receivedDataStr);
}
}];
NSLog(@"异步获取数据,不影响其他代码执行!");
}
同步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.设置请求方法
request.HTTPMethod = @"POST";
// 4.参数转换成为字符串
NSString *dataStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
// 5.加载参数
request.HTTPBody = data;
// 6.连接
NSData *dataPost = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// 7.判断是否成功并输出
if (dataPost) {
NSLog(@"获取数据成功!");
NSString *dataPostStr = [[NSString alloc] initWithData:dataPost encoding:NSUTF8StringEncoding];
NSLog(@"%@",dataPostStr);
} else {
NSLog(@"获取数据失败!");
}
}
异步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.设置请求方法
request.HTTPMethod = @"POST";
// 4.参数转换成为字符串
NSString *dataStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
// 5.加载参数
request.HTTPBody = data;
// 6.连接获取数据
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if (connectionError) {
NSLog(@"获取数据失败----%@",connectionError.description);
} else {
NSLog(@"获取数据成功!");
NSString *dataPostStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",dataPostStr);
}
}];
NSLog(@"异步获取数据!");
}
异步POST请求Delegate模式
异步POST请求现如今使用的非常少,通过代理时间进行驱动
NSURLConnectionDataDelegate与NSURLConnectionDelegate两个协议代理进行.
四. iOS7之后请求变化
在WWDC 2013中,Apple的团队对NSURLConnection进行了重构,并推出了NSURLSession作为替代.
支持后台运行的网络任务.
暂停,停止,重启网络任务,不再需要NSOpation封装
请求可以使用同样的适配容器
不同的session可以使用不同的私有存储,block和协议可以同时起作用.
所有的任务默认是挂起的,需要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.创建session对象
NSURLSession *session = [NSURLSession sharedSession];
// 3.连接请求数据
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"请求数据失败!---------%@",error.description);
} else {
NSLog(@"请求数据成功!");
NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",dataStr);
}
}];
// 4.启动请求
[dataTask resume];
NSLog(@"请求数据开始!");
}
- 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.创建session对象
NSURLSession *session = [NSURLSession sharedSession];
// 3.创建请求对象
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
// 4.设置请求方式与参数
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.进行链接请求数据
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"请求数据出错!----%@",error.description);
} else {
NSLog(@"请求数据成功!");
NSString *dataPostStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",dataPostStr);
}
}];
// 6.开启请求数据
[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.创建session对象
NSURLSession *session = [NSURLSession sharedSession];
// 3.创建请求对象
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
// 4.设置请求方式与参数
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:@"(设置保存文件的地址)"];
// 将文件移动到指定的路径
[fileManager copyItemAtURL:location toURL:targetUrl error:nil];
}
}];
}