iOS中的数据传输(HTTP协议)

来源:互联网 发布:天睿软件 编辑:程序博客网 时间:2024/05/21 14:51

客户端与服务器做数据传输时,数据必须约定使用统一格式.数据格式有 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 >:

- (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 *)downloadTaskdidFinishDownloadingToURL:(NSURL *)location{    [self moveDownloadFile:location withNewFile:@"Documents/file.dmg"];}@end


0 0