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

不同点:

  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];
        }
    }];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,098评论 25 707
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,966评论 6 13
  • URL:就是资源的地址、位置,每一个互联网资源都有一个唯一的URL。HTTP协议:Hyper Text Trans...
    Zzzzzzz7阅读 372评论 0 1
  • 文/孤独客 很久之前读了张嘉佳的作品《从你的全世界路过》,那时候只是简单的读了一下,没有什么心得,最近看了由这本书...
    EulerSpace阅读 253评论 0 0