iOS 之数据请求

2016-04-14  本文已影响394人  CarsonChen

一. HTTP和HTTPS协议

URL:Uniform Resource Locator (统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源.
URL就是资源的地址,位置,互联网上的每个资源都有一个唯一的URL
URL的基本格式=协议://主机地址/路径
不同的协议,代表着不同的资源查找方式,资源传输方式.

HTTP:Hyper Text Transfer Protocol (超文本传输协议),HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型.

HTTPS:Secure Hypertext Transfer Protocol (安全超文本传输协议),HTTPS是一个安全通信通道,基于HTTP开发,用于在客户计算机和服务器之间交换信息.使用安全套接字层(SSL)进行信息交换,简答来说它是HTTP的安全版.HTTPS协议使用SSL在发送方把原始数据进行了加密过程,然后在接收方进行解密,加密和解密的过程需要发送方和接收方通过交换共知的密钥完成.所以传输的网络数据不会被黑客截获和解密.

HTTPS协议需要的CA申请证书,一般免费证书很少,收费.
HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性SSL加密的传输协议.
HTTP和HTTPS是用的是完全不同的链接方式,用的端口也不同,前者是80,后者是443
HTTP的链接很简单,是无状态的.
HTTPS协议是由SSL+HTTP协议构成的可以进行加密传输,身份认证的网络协议 要比HTTP安全.

二. HTTP协议的常见的请求方式

GET
POST
都能给服务器传输数据

不同点:

  1. 给服务器传输数据的方式不同:GET:通过网址字符串传输 POST:同data传输
  2. 传输数据的大小:GET:网址字符串最多255字节 POST:使用NSData,容量无上限.
  3. 安全性: GET:所传输给服务的数据,显示在网址内,类似于密码的明文输入,直接可见. POST:数据被转成NSData(二进制数据),类似于密码输入,无法直接读取.

三. iOS实现网络编程

  1. 设置代理,接收数据.
  2. 实现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.后台会话模式

- (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(@"请求数据开始!");
}
- (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
}
- (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];
        }
    }];
}
上一篇下一篇

猜你喜欢

热点阅读