iOS网络之数据请求GET和POST
1. HTTP和HTTPS协议
1> URL
URL全称是Uniform Resource Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源
URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL
URL的基本格式=协议://主机地址/路径
http://www.cnblogs.com/gfxxbk/
协议:不同的协议,代表着不同的资源查找方式,资源传输方式
主机地址:存放资源的主机的IP地址(域名)
路径:资源在主机中的位置
2> HTTP协议的概念
HTTP协议,Hyper Text Transfer Protocol(超文本传输协议)是用于从万维网(WWW)服务器传送超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。
3> HTTP的工作原理
HTTP 协议采用请求/响应模型。客户端向服务器发送一个请求报文,服务器以一个状态作为响应。
4> C/S模式
Client和Server常常分别处在相距很远的两台计算机上,Client程序的任务是将用户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序
5> HTTPS
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。 它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。 HTTPS协议使用SSL在发送方把原始数据进行加密,然后在接收方进行解密,加密和解密需要发送方和接受方通过交换共知的密钥来实现,因此,所传送的数据不容易被网络黑客截获和解密。
6> SSL
SSL是Netscape公司所提出的安全保密协议,在浏览器(如Internet Explorer、Netscape Navigator)和Web服务器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之间构造安全通道来进行数据传输,SSL运行在TCP/IP层之上、应用层之下,为应用程序提供加密数据通道,
7> HTTP和HTTPS的异同
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议
http和https使用的是完全不同的链接方式,用的端口也不一样,前者是80,后者是443.
http的链接很简单,是无状态的.
- https是协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议要比http安全
2. HTTP协议的常见请求方式
1> 请求方式
GET
POST
2> 两种请求方式的比较
- 给服务器传输数据的方式不同
GET:通过网址字符串
POST:通过data
- 传输数据的大小
GET:网址字符串最多255字节
POST:使用NSData,容量超过1G
- 安全性
GET:所有传输给服务的数据,显示在网址里,类似于密码的明文输入,直接可见
POST:数据被转成NSData(二进制数据),类似于密码的密文输入,无法直接读取
3. iOS实现网络编程(iOS7之前的版本,现在已经弃用,但是仍然可以使用)
1> HTTP协议请求如何实现
网络请求地址对象NSURL的作用及用法
网络请求对象NSURLRequest,NSMutableURLRequest的作用及用法
网络链接对象NSURLConnection的作用及用法
网络链接协议NSURLConnectionDelegate的作用及用法
2> NSURL
url:统一资源定位符,也被称为网址,因特网上标准的资源网址
一个典型的url:http://lily:123456@www.google.com/search?hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page
url的符语法: 协议://授权/路径?查询
协议: ftp://(文件传输协议) http://(超文本传输协议)
https://(安全超文本传输协议) file://(本地文件协议)
3> 连接方式
同步连接:程序容易出现卡死现象
异步连接:等待数据返回
异步连接有两种实现方式:
① 设置代理,接收数据
② 实现block
4> 打开Xcode网络适配
使用http请求 :NSAppTransportSecurity 字典 ,NSAllowsArbitraryLoads YES
代码:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
图表:
5> 同步连接
① GET同步
- (IBAction)getSynchronousRequest:(UIButton *)sender
{
// 1. 创建URL
// GET_URL 是一个get网络传值的域名
NSURL *url = [NSURL URLWithString:GET_URL]; // 2. 根据URL创建具体请求(使用缓存策略)
// 第一个参数:URL(统一资源定位符)
// 第二个参数:缓存策略(枚举值)
/*
NSURLRequestUseProtocolCachePolicy = 0 基础缓存策略 NSURLRequestReloadIgnoringLocalCacheData = 1 忽略本地的缓存,所有的数据都从网络获取 NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4 如果本地有缓存且有效就从本地获取,否则从原地址下载 NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 优先使用本地缓存,如果没有本地缓存就从网络加载 NSURLRequestReturnCacheDataElseLoad = 2 使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作 NSURLRequestReturnCacheDataDontLoad = 3 无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载 NSURLRequestReloadRevalidatingCacheData = 5 如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载 */
// 第三个参数:设置延迟时间,如果超时,请求终止,单位为秒(s)
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:]; // 3. 连接服务器【NSURLConnection在iOS9之后被弃用,在以后的开发中很少见】
// 参数1:请求对象
// 参数2:存储一些网络请求的信息(一般为包体),一般为nil
// 参数3:错误信息
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; // 4. 进行JSON数据解析
NSDictionary *resultDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSLog(@"%@", resultDict); // 解析数据自己写
}
② POST同步
#pragma mark - 同步的post请求
- (IBAction)postSynchronousRequest:(UIButton *)sender
{
// 1. 创建URL
NSURL *url = [NSURL URLWithString:POST_URL]; // 2. 设置网络请求[post请求必须初始化为可变请求,因为稍后要进行一些内容设置]
NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url]; // 2.5 设置body
// 创建一个连接字符串(这个内容在以后的开发中接口文档都有标注)
NSString *dataString = POST_BODY;
// 对接口字符串进行编码(这一步千万不能忘记)
NSData *postData = [dataString dataUsingEncoding:NSUTF8StringEncoding];
// 设置请求格式为POST请求[这个地方在后面POST必须大写]
[mutableRequest setHTTPMethod:@"POST"];
// 设置请求体(body)
[mutableRequest setHTTPBody:postData]; // 3. 连接服务器
NSData *data = [NSURLConnection sendSynchronousRequest:mutableRequest returningResponse:nil error:nil]; // 4. 进行JSON数据解析
NSDictionary *resultDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSLog(@"%@", resultDict);
}
注意:post方法和get方法最大的区别就是在于post方法设置请求体(body)
注意:若网址字符串URLString中若有类对象,可以使用此方法处理:[URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
7> 异步代理
代码(代码为get请求,post请求同理,只要动态实现请求体):
- (IBAction)getAsynchronousRequest:(UIButton *)sender
{
// 1. 创建URL
NSURL *url = [NSURL URLWithString:GET_URL]; // 2. 创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 方法一:使用delegate实现
[NSURLConnection connectionWithRequest:request delegate:self];
} #pragma mark - NSURLConnectionDataDelegate相关的代理方法
// 服务器开始响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
self.resultData = [NSMutableData data];
} // 开始接受数据
// 这个方法会重复执行,得到的每段数据拼接在一起就可以了
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[self.resultData appendData:data];
} // 结束服务器
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// 进行数据解析
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.resultData options:NSJSONReadingAllowFragments error:nil]; NSLog(@"%@", dict);
}
8>异步Block
代码:
#pragma mark - 异步的get请求
- (IBAction)getAsynchronousRequest:(UIButton *)sender
{
// 1. 创建URL
NSURL *url = [NSURL URLWithString:GET_URL]; // 2. 创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3. 连接服务器
// 方法一:Block方法实现
// 参数1:请求对象
// 参数2:线程队列 [NSOperationQueue mainQueue] 主队列 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { // response是携带的接口信息
// data 请求下来的数据,接下来会使用到
// connectionError 错误信息
if (connectionError == nil) {
// 4. 解析
NSDictionary *resultDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSLog(@"dict = %@", resultDict); // 先开辟子线程解析数据,然后在主线程刷新UI
}
}];
}
4. iOS7之后请求变化
1> NSURLSession
在WWDC 2013中,Apple的团队对NSURLConnection进行了重构,并推出了NSURLSession作为替代。
• 支持后台运行的网络任务
• 暂停、停止、重启网络任务,不再需要 NSOpation 封装
• 请求可以使用同样的配置容器
• 不同的 session 可以使用不同的私有存储,block和代理可以同时起作用 • 直接从文件系统上传、下载
• 为了方便程序员使用,苹果提供了一个全局 session
• 所有的 任务(Task) 都是由 Session 发起的
• 所有的任务默认是挂起的,需要 Resume
2> 三种工作模式:
+ (NSURLSessionConfiguration *)defaultSessionConfiguration; 默认会话模式
+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration; 瞬时会话模式
+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier; 后台会话模式
3> NSURLSession支持的三种任务
对数据加载:使用NSURLSessionDataTask和NSURLSessionTask两者没有本质区别
处理下载任务使用:NSURLSessionDownloadTask
要处理上传任务使用:NSURLSessionUploadTask
4> Block方法
① GET请求
#pragma mark GET的block方法
- (void)bolckMethod
{
// 方法1:使用Block // 1. 创建URL
NSURL *url = [NSURL URLWithString:GET_URL]; // 2. 创建session对象(iOS9之后推出)
NSURLSession *session = [NSURLSession sharedSession]; // 3. 创建task请求任务
// NSURLSession是基于任务去完成相关的事件的
// 参数1. 请求的URL
// NSURLSessionTask 所有的任务都放在这个里实现
// 对数据加载:使用NSURLSessionDataTask和NSURLSessionTask两者没有本质区别
// 处理下载任务使用:NSURLSessionDownloadTask
// 要处理上传任务使用:NSURLSessionUploadTask
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 4. 解析数据
if (error == nil) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@=get-block", dict);
}
}]; // 5. 核心:启动任务【千万不能忘记】
// 原因:NSURLSessionTask实例出来的任务处于挂起状态,如果不启动,不会走Block里面的相关内容
[task resume];
}
② POST请求
- (IBAction)postRequest:(UIButton *)sender
{
// Block方法 NSURL *url = [NSURL URLWithString:POST_URL]; NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url]; NSString *dataString = POST_BODY; NSData *postData = [dataString dataUsingEncoding:NSUTF8StringEncoding]; [mRequest setHTTPMethod:@"POST"]; [mRequest setHTTPBody:postData]; NSURLSession *sessin = [NSURLSession sharedSession]; NSURLSessionTask *task = [sessin dataTaskWithRequest:mRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error == nil) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@=post-block", dict);
}
}]; [task resume];
}
5> delegate方法
代码(GET请求):
#pragma mark GET的delegate方法
- (void)delegateMethod
{
// 方法2:使用代理实现
// 1. 创建URL
NSURL *url = [NSURL URLWithString:GET_URL]; // 2. 创建session
// 参数1:模式设置
/*
+ (NSURLSessionConfiguration *)defaultSessionConfiguration; 默认会话模式
+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration; 瞬时会话模式
+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier; 后台会话模式
*/
// 参数2:代理
// 参数2:线程队列模式
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]]; // 3. 创建task对象
NSURLSessionDataTask *task = [session dataTaskWithURL:url]; // 4. 启动任务
[task resume];
} #pragma mark NSURLSessionDelegate协议方法
// 服务器开始响应
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
// 允许服务器响应【在这里只允许服务器响应了才会接受到这个数据】
completionHandler(NSURLSessionResponseAllow);
// 初始化data,稍后进行片段的拼接存储
self.resultData = [NSMutableData data];
} // 接受数据拼接
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
// 反复执行,然后拼接数据
[self.resultData appendData:data];
} // 数据接受完成,网络请求结束
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
// 解析
if (error == nil) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.resultData options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@=get-delegate", dict);
}
}
6> NSURLSession数据任务
适合于小的数据访问,例如:JSON,XML,Plist,HTML,图像
iOS网络之数据请求GET和POST的更多相关文章
- iOS网络_优化请求性能
iOS网络_优化请求性能 一,度量网络性能 1,网络带宽 用于描述无线网络性能的最常见度量指标就是带宽.在数字无线通信中,网络带宽可以 描述为两个端点之间的通信通道每秒钟可以传输的位数.现代无线网络所 ...
- 【原】iOS学习39网络之数据请求
1. HTTP和HTTPS协议 1> URL URL全称是Uniform Resource Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址.位 ...
- IOS网络编程之请求内容
资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 人魔七七:http://www.cnblogs.com/qiqibo/ 一个http请求只要由三 ...
- ios网络_json数据解析
网络上数据传输以json或者xml格式. json是字典 或者 数组 或者字典跟数组嵌套的形式.解析json就是把json反序列化(解析)---把json转换为oc对象.json序列化就是把oc对象转 ...
- 网络编程---(数据请求+slider)将网络上的大文件下载到本地,并打印其进度
网络编程---将网络上的大文件下载到本地,并打印其进度. 点击"開始传输"button.将网络上的大文件先下载下来,下载完毕后,保存到本地. UI效果图例如以下: watermar ...
- iOS学习之数据请求
GET请求----同步连接 //GET请求 同步连接 - (void)handleSynchronize:(UIBarButtonItem *)item { //GET请求 //1.创建网址字符串; ...
- iOS网络开发-AFNetworking请求asp.net WebService
看到园子有位朋友需要使用AFN框架请求 WebService,所以就整理了一下,demo下载链接在底部 编写WebService可以看这篇博客 http://www.cnblogs.com/linmi ...
- ios网络:应用一个请求的7个步骤
Splitting big tasks into small tasks is often one of the best ways to solve a problem. Thus, in the ...
- iOS - NetRequest 网络数据请求
1.网络请求 1.1 网络通讯三要素 1.IP 地址(主机名): 网络中设备的唯一标示.不易记忆,可以用主机名(域名). 1) IP V4: 0~255.0~255.0~255.0~255 ,共有 2 ...
随机推荐
- iOS面试题05-父子控制器、内存管理
内存管理.父子控制器面试题 1.建立父子关系控制器有什么用 回答:1>监听屏幕选中 2>如果想拿到你当前的很小的一个控制器所在的导航控制器必须要跟外面比较大的控制器建立父子关系,才能一层一 ...
- zoj 3708 Density of Power Network
/*看英文和图我头都大了,不过很简单的.*/ #include<string.h> #include<stdio.h> ][],q[],w[]; int main(int ar ...
- 五子棋Web版的开发(一)---搭建IDEA SSH环境
最近公司都没啥事,我在完成了控制台版的本地五子棋后(github地址:https://github.com/lkq51/wuziqi_console2),想将他升级成为一个web版的五子棋游戏.因为公 ...
- jvm监控命令介绍
1.jstack介绍 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在 ...
- Javaweb统计在线人数的小栗子
最近在学习Javaweb相关的内容(不黑不吹之前对web开发零基础),下面通过一个统计在线人数的小栗子讲讲Servlet监听器吧 开发环境 eclipse tomcat 7 先说说这个小栗子的构思: ...
- ajaxFileUpload用法
首先要引入两个js <script type="text/javascript" src="/static/js/jquery.js"></s ...
- TortoiseSVN是windows平台下Subversion的免费开源客户端。
一般我们都是先讲讲服务器的配置,然后再讲客户端的使用,但是在TortoiseSVN上,却可以反过来.因为,如果你的要求不高,只是想在本机,或者是可信任的局域网络中使用SVN版本控制,可以不需要安装SV ...
- Qt官方开发环境生成的exe发布方式--使用windeployqt(windeployqt是单独的程序,放在低版本qt4目录下也可以运行的)
Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...
- Json.Net系列教程 2.Net类型与JSON的映射关系
原文 Json.Net系列教程 2.Net类型与JSON的映射关系 首先谢谢大家的支持和关注.本章主要介绍.Net类型与JSON是如何映射的.我们知道JSON中类型基本上有三种:值类型,数组和对象.而 ...
- android studio 快捷笔记
setting->editor->打勾 ctrl+Q ctrl+tab alt+回车 ctrl+shift+回车