美文网首页
iOS 之数据请求

iOS 之数据请求

作者: CarsonChen | 来源:发表于2016-04-14 20:55 被阅读394次

    一. 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的区别

    不同点:

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

    三. iOS实现网络编程

    • HTTP协议如何实现请求数据
      网络请求对象NSURLRequest,NSMutableURLRequest
      网络链接短信NSURLConnection的作用及其用法
      网络链接协议NSURLCOnnectionDelegate

    • HTTP连接方式
      同步连接:程序容易出现卡死现象
      异步连接:等待数据返回
      异步连接有两种实现方式:

    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.后台会话模式

    • 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];
            }
        }];
    }
    

    相关文章

      网友评论

          本文标题:iOS 之数据请求

          本文链接:https://www.haomeiwen.com/subject/fbnglttx.html