您的位置:首页 > 理论基础 > 计算机网络

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 >:

- (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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: