iOS中的数据传输(HTTP协议)
2015-10-22 18:30
405 查看
客户端与服务器做数据传输时,数据必须约定使用统一格式.数据格式有 JSON数据丶XML数据丶HTML数据等等.
HTTP协议全称"超文本传输协议",浏览器和服务器之间的通信规则.HTTP协议永远都是客户端发起请求,服务器回送响应.客户端发送的HTTP请求,是向服务器提交了一个HTTP请求包.服务器收到该请求之后,向客户端回应一个HTTP响应包.
HTTP常用的请求方式:GET请求和POST请求.GET请求:一般用于向服务器索取数据的一种请求方式,POST请求:一般用于向服务器提交数据的一种请求方式(注册用户丶用户登录).因为HTTP请求包的结构是由HTTP请求头
和 HTTP请求体组成.而POST请求方式才有请求体,GET请求只有请求头.所以GET请求向服务器提交数据是只能放在URL后面,这样不利于用户数据的保密性,而POST请求可以将用户的重要数据放入请求体,避免了用户数据的泄露问题.
HTTP响应包是由响应头丶响应体两部分组成.HTTP响应有个状态码,标示着响应的结果,如:200表示成功,404表示未找到页面服务器响应包将数据发给客户端时,数据主要是在响应体中.
数据请求可以使用 同步请求或者异步请求,值得注意的是UI界面的渲染与刷新必须在主线程中执行,而主线程不流畅会导致UI界面卡顿.所以建议数据请求如果允许尽量使用异步请求,确保主线程的流畅性.
iOS用于网络请求的框架有CFNetWork,它是一种底层的高性能架构,是基于BSD
sockets的基础上做了拓展.在iOS7之前的网络组件为NSURLConnection; iOS7之后,苹果推出了NSURLConnection的继任者:NSURLSession.
NSURLSession网络组件的使用流程为:
1>.构造NSURL实例(链接地址)
2>.构造NSURLRequest请求
3>.构造NSURLSessionConfiguratioin<可选>
4>.构造NSURLSession
发送请求
<
GET请求Demo >:
< POST请求Demo >:
NSURLRequest是用于存储客户端发送给服务器的数据包信息和请求设置,由于NSURLRequest只有很少的基本设置选项,大部分使用其子类:NSMutableURLRequest
NSURLResponse是用于存储服务器返回的响应包数据,如果发送的是HTTP请求,那么使用其子类:NSHTTPURLResponse
NSURLSession指的是一个网络回话(session),而一个网络会话可以发起多个任务(Task),一个任务对应了一次网络请求
NSURLSessionConfiguration用于配置创建Session的类型
NSURLSessinTask网络任务有三种类型的任务:
1).NSURLSessionDataTask:数据任务
2).NSURLSessionUploadTask:上传任务
3).NSURLSessionDownloadTask:下载任务
上传任务:
下载任务:
后台下载:
HTTP协议全称"超文本传输协议",浏览器和服务器之间的通信规则.HTTP协议永远都是客户端发起请求,服务器回送响应.客户端发送的HTTP请求,是向服务器提交了一个HTTP请求包.服务器收到该请求之后,向客户端回应一个HTTP响应包.
HTTP常用的请求方式:GET请求和POST请求.GET请求:一般用于向服务器索取数据的一种请求方式,POST请求:一般用于向服务器提交数据的一种请求方式(注册用户丶用户登录).因为HTTP请求包的结构是由HTTP请求头
和 HTTP请求体组成.而POST请求方式才有请求体,GET请求只有请求头.所以GET请求向服务器提交数据是只能放在URL后面,这样不利于用户数据的保密性,而POST请求可以将用户的重要数据放入请求体,避免了用户数据的泄露问题.
HTTP响应包是由响应头丶响应体两部分组成.HTTP响应有个状态码,标示着响应的结果,如:200表示成功,404表示未找到页面服务器响应包将数据发给客户端时,数据主要是在响应体中.
数据请求可以使用 同步请求或者异步请求,值得注意的是UI界面的渲染与刷新必须在主线程中执行,而主线程不流畅会导致UI界面卡顿.所以建议数据请求如果允许尽量使用异步请求,确保主线程的流畅性.
iOS用于网络请求的框架有CFNetWork,它是一种底层的高性能架构,是基于BSD
sockets的基础上做了拓展.在iOS7之前的网络组件为NSURLConnection; iOS7之后,苹果推出了NSURLConnection的继任者:NSURLSession.
NSURLSession网络组件的使用流程为:
1>.构造NSURL实例(链接地址)
2>.构造NSURLRequest请求
3>.构造NSURLSessionConfiguratioin<可选>
4>.构造NSURLSession
发送请求
<
GET请求Demo >:
- (IBAction)getAction:(id)sender { //1.构造URL NSString *stringURL = @"https://api.douban.com/v2/movie/us_box"; NSURL *url = [NSURL URLWithString:stringURL]; //2.构造Request //一般使用可变的 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //<1>设置请求方式,默认就是GET请求 [request setHTTPMethod:@"GET"]; //<2>设置超时时间 [request setTimeoutInterval:30]; //<3>设置请求头 // request setAllHTTPHeaderFields:<#(NSDictionary *)#> // [request setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>] // [request addValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>] //<4>设置请求体 // [request setHTTPBody:<#(NSData *)#>] //4.构造session,发送会话请求 NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error == nil) { //data 就是响应体 // response 可以获取响应头 // NSLog(@"data:%@",data); //<1>获取响应体 //将请求的数据转换成字符串 NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; //错误,需要回到主线程操作UI // _textView.text = str; [_textView performSelectorOnMainThread:@selector(setText:) withObject:str waitUntilDone:NO]; //<2>获取响应头 NSHTTPURLResponse *r = (NSHTTPURLResponse *)response; NSDictionary *header = r.allHeaderFields; NSLog(@"header:%@",header); } }]; //开始任务 [task resume]; // [task suspend]; }
< POST请求Demo >:
//POST请求 - (IBAction)postAction:(id)sender { //1.构造URL NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/movie/detail.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"]; //2.构造Request NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; //设置一些信息 //<1>设置请求方式 [request setHTTPMethod:@"POST"]; //<2>设置请求超时时间 [request setTimeoutInterval:30]; //<3>设置请求头 // [request setAllHTTPHeaderFields:<#(NSDictionary *)#>] // [request addValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>] // [request setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>] //<4>设置请求体 NSString *bodyString = @"movie_id=43485"; NSData *data = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:data]; //3.创建配置session的对象 //4.构造session NSURLSession *session = [NSURLSession sharedSession]; //链接服务器 NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error == nil) { //取得响应体 NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; // _textView.text = str; [_textView performSelectorOnMainThread:@selector(setText:) withObject:str waitUntilDone:YES]; //取得响应头 NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response; NSDictionary *dic = urlResponse.allHeaderFields; NSLog(@"dic:%@",dic); } }]; //开始任务 [task resume]; }
NSURLRequest是用于存储客户端发送给服务器的数据包信息和请求设置,由于NSURLRequest只有很少的基本设置选项,大部分使用其子类:NSMutableURLRequest
NSURLResponse是用于存储服务器返回的响应包数据,如果发送的是HTTP请求,那么使用其子类:NSHTTPURLResponse
NSURLSession指的是一个网络回话(session),而一个网络会话可以发起多个任务(Task),一个任务对应了一次网络请求
NSURLSessionConfiguration用于配置创建Session的类型
NSURLSessinTask网络任务有三种类型的任务:
1).NSURLSessionDataTask:数据任务
2).NSURLSessionUploadTask:上传任务
3).NSURLSessionDownloadTask:下载任务
上传任务:
// fileURL: 上传文件的路径 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler // bodyData: 上传文件的data数据 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;
下载任务:
// location:文件下载完成后,存放的路径 - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler // 支持断点续传,resumeData:之前下载的数据 - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler
后台下载:
/* 演示后台下载,文件的临时保存路径为:Library/Caches/ 里面,程序进入后台后 观察这个文件的大小变化 */ @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"%@", NSHomeDirectory()); NSURL *url = [NSURL URLWithString:@"http://free2.macx.cn:8182/tools/network/Thunder266.dmg"]; // 1.创建Session配置对象,配置类型:后台会话类型 NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"kBackTaskID"]; // 2.创建Session对象 NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; // 3.创建任务,使用后台会话类型创建的任务都支持后台加载 NSURLSessionDownloadTask *downTask = [session downloadTaskWithURL:url]; // 4.开始任务 [downTask resume]; } -(void)moveDownloadFile:(NSURL *)location withNewFile:(NSString *)newFile { NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:newFile]; NSURL *toUrl = [NSURL fileURLWithPath:filePath]; NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL exist = [fileManager fileExistsAtPath:filePath]; if (!exist) { [fileManager moveItemAtURL:location toURL:toUrl error:NULL]; } NSLog(@"文件保存成功"); } - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { [self moveDownloadFile:location withNewFile:@"Documents/file.dmg"]; } @end
相关文章推荐
- Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary except
- Android 通过WebService进行网络编程,使用工具类轻松实现
- Java网络学习和笔记——黑马训练营
- UNP总结 Chapter 4 基本TCP套接字编程
- 网络通信 --> epoll用法
- android:判断手机网络类型
- (高级篇 Netty多协议开发和应用)第十章-Http协议开发应用(基于Netty的HttpServer和HttpClient的简单实现)
- http://www.cnblogs.com/xuxuanxubao/
- 无线网络没信号
- VMware NAT端口映射 外网可以访问内网虚拟机
- TCP三次握手过程
- HttpURLConnection以及GBK转UTF-8中文部分乱码问题
- 提供一个Matlab的BP神经网络的基础资料
- c#使用HttpWebRequest,HttpWebResponse快速验证代理IP是否有用
- HttpClient的基本使用
- Can not find the tag library descriptor for "http://java.sun.com/jsp/ jstl/core"
- linux 网络监测工具---iftop
- 从ova文件导入虚拟机后虚拟机无法连接网络
- win10无线网络不稳定的原因分析及解决办法
- IOS HTTP,TCP/IP