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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值