网络相关

NSURLSession

2016-10-13  本文已影响96人  彼岸的黑色曼陀罗

NSURLSession基本使用

简介

如何发送GET请求

方法一
方法二
方法三
[[NSURLSession sharedSession]dataTaskWithURL:[NSURL URLWithString:]completionHandler:{解析数据}]resume]

如何发送POST请求

代理方法的使用

登录小案例

数据解析

JSON

JSON反序列化处理(JSON->OC)
JSON序列化处理(OC->JSON)
OC和JSON转换的注意点:
复杂JSON解析-数据展示
[[ NSURLSession sharedSession]dataTaskWithURL:[NSURL URLWithString:@""] completionHandler:^{
解析服务器返回的数据
NSDictionary * dict = [NSJSONSeriazlization JSONObjectWithData:options:error:] 
方法一:写成plist文件
[dict writeToFile:atomically:]
得到字典数组
NSArray *array = [dict objectForKey:]
self.videos = array ;
//回到主线程显示数据
dispatch_async(dispatch_get_main_queue(),^{
刷新tableView
[self.tableView reloadData]
});
}] resume]; 
复杂JSON解析- 播放视频
复杂JSON解析 - 面向模型开发
 [模型名称 mj_setupReplaceKeyFromPropertyName:^NSDictionary*{
    return @{@"ID":@"id"};
        }] 

XML(不需要掌握)

使用NSXMLParser解析XML
使用GDataXML解析XML

JSON和XML比较

文件下载

小文件下载

NSURLSessionDataTask下载文件

NSURLSession发请求下载文件(DataTask-代理)
监听文件下载进度
解决内存飙升的问题- 文件句柄指针
解决内存飙升的问题- 输出流的基本使用
常用操作
文件断点下载
离线断点下载优化(进度条)

NSURLSessionDownloadTask下载文件

直接使用block下载文件
设置代理来下载文件
NSURLSessionDownloadTask常见操作
NSURLSessionDownloadTask断点下载
离线断点下载(DownloadTask是没有办法实现离线断点下载的)

文件上传

文件上传分析

文件上传格式简化:
`分隔符`:----WebKitFormBoundaryjh7urS5p3OcvqXAT

请求头
Content-Type:multipart/form-data; boundary=分隔符

拼接参数的格式
 文件参数
/*
    --分隔符
    Content-Disposition: form-data; name="file"; filename="Snip20160716_103.png"
    Content-Type: image/png
    空行
    文件数据
 */
 非文件参数
/*
    --分隔符
    Content-Disposition: form-data; name="username"
    空行
    xiaomage
*/
 结尾标识
/*
--分隔符--
*/

文件上传实现

#define Kboundary @"----WebKitFormBoundaryjh7urS5p3OcvqXAT
"
确定请求路径
创建可变的请求对象
修改请求方法为POST
设置请求头
//Content-Type:multipart/form-data; boundary=分隔符
[NSString stringWithFormat:@"multipart/form-data;boundary = %@",Kboundary]
[request setValue:forHTTPHeaderField:@"Content-Type"]
拼接参数- 设置请求头
NSData *data = 提供一个方法拼接参数
//!!!!无效被忽略request.HTTPBody = data;
创建会话对象
根据会话对象创建uploadTask请求
uploadTaskWithRequest:fromData:completionHandler:
     参数一:请求对象
     参数二:要传递的是本应该设置为请求体的参数
     参数三:当上传完成的时候调用
         data:响应体 
         response:响应头信息
发送请求resume
解析服务器返回的数据JSON数据解析
按照固定形式拼接参数
#define Kboundary  @"----WebKitFormBoundaryjh7urS5p3OcvqXAT"
#define KNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]
-(NSData *)getBodyData
{
    NSMutableData *data = [NSMutableData data];
    
    //01 文件参数
    /*
     --分隔符
     Content-Disposition: form-data; name="file"; filename="Snip20160716_103.png"
     Content-Type: image/png
     空行
     文件数据
     */
    
    [data appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:KNewLine];
    //file 文件参数 参数名 == username
    //filename 文件上传到服务器之后以什么名称来保存
    [data appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"123.png\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:KNewLine];
    
    //Content-Type 文件的数据类型
    //file和username是参数
    //分隔符可以随意些,但是不能有中文
    [data appendData:[@"Content-Type: image/png" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:KNewLine];
    [data appendData:KNewLine];
    NSData *imageData = [NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/Snip20160716_125.png"];
    [data appendData:imageData];
    [data appendData:KNewLine];
    
    //02 非文件参数
    /*
     --分隔符
     Content-Disposition: form-data; name="username"
     空行
     xiaomage
     */
    [data appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:KNewLine];
    //username 参数名称
    [data appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:KNewLine];
    [data appendData:KNewLine];
    [data appendData:[@"xiaomage" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:KNewLine];
    
    //03 结尾标识
    /*
     --分隔符--
     */
    [data appendData:[[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    //拼接
    return data;
}

监听文件上传进度

获得文件的MIMEType

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{

    //01 发送请求|得到响应头信息(MIMEType)
    //02 直接百度查表 http://www.w3school.com.cn/media/media_mimeref.asp
    //03 使用C语言的函数来获取
    //04 设置为通用的二进制数据类型 application/octet-stream
   NSLog(@"%@",[self mimeTypeForFileAtPath:@"/Users/xiaomage/Desktop/Snip20160716_103.png"]);
}


- (NSString *)mimeTypeForFileAtPath:(NSString *)path
{
    if (![[[NSFileManager alloc] init] fileExistsAtPath:path]) {
        return nil;
    }
    
    CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[path pathExtension], NULL);
    CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType);
    CFRelease(UTI);
    if (!MIMEType) {
        return @"application/octet-stream";
    }
    return (__bridge NSString *)(MIMEType);
}


-(void)getMimetype
{
   
    
    [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/上课笔记.h"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //MIMEType = 大类型/小类型
        NSLog(@"%@",response.MIMEType);
    }] resume];
}

文件的压缩解压缩

多值参数

NSURLSession配置

总结

上一篇下一篇

猜你喜欢

热点阅读