get请求
- (void)get
{
NSURLSession *session = [NSURLSession sharedSession];
// 1. 方式一:
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"get请求地址"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
}];
// 2. 方式二: 如果想设置request就用这个
// session dataTaskWithRequest:<#(nonnull NSURLRequest *)#> completionHandler:<#^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)completionHandler#>
// 启动任务
[task resume];
}
post请求
- (void)post
{
NSURLSession *session = [NSURLSession sharedSession];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"post请求地址"]];
request.HTTPMethod = @"POST";
// 请求体
request.HTTPBody = [@"username=zhangsan&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];
[[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}] resume];
}
下载
- (void)downLoad
{
NSURLSession *session = [NSURLSession sharedSession];
// 默认下载到temp文件夹下, 如果不做操作, 就会被移除
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"文件的下载地址"] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 文件将来存放的地址
// suggestedFilename 服务器中的文件名
NSString *file = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
// 剪切location路径下的临时文件到以后文件存放的地址
NSFileManager *mgr = [NSFileManager defaultManager];
[mgr moveItemAtURL:location toURL:[NSURL fileURLWithPath:file] error:nil];
}];
[task resume];
}
data的代理方法(和NSURLConnect相似)
#import "ViewController.h"
/**
* 这里的代理, 根据你后面的操作来选择 (NSURLSessionDataDelegate, NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate)等代理
*/
@interface ViewController () <NSURLSessionDataDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// session的代理是只读的,所以只能创建的时候设置
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
// 创建任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"网络地址"]]];
// 启动任务
[task resume];
}
#pragma mark - NSURLSessionDataDelegate
/**
* 1. 接受到服务器的响应
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
NSLog(@"%s",__func__);
// 这里根据响应头中的消息, 再来判断是否符合要求, 是否继续执行接受数据
// 默认为不接受数据,取消任务
// 如果响应头符合要求, 执行completionHandler block,则继续执行2,3步
completionHandler(NSURLSessionResponseAllow);
}
/**
* 2. 接受到服务器的数据 (调用多次)
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSLog(@"%s",__func__);
}
/**
* 3. 请求成功完成或者失败都调用这个方法(如果失败,error有值)
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"%s",__func__);
if (error) {
NSLog(@"请求失败");
} else{
NSLog(@"请求完成");
}
}
大文件显示进度的下载
#import "ViewController.h"
/**
* 这里的代理, 根据你后面的操作来选择 (NSURLSessionDataDelegate, NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate)等代理
*/
@interface ViewController () <NSURLSessionDownloadDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// session的代理是只读的,所以只能创建的时候设置
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
// 创建任务
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"下载地址"]];
// 启动任务
[task resume];
}
#pragma mark - NSURLSessionDownloadDelegate
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"%s",__func__);
if (error) {
NSLog(@"请求失败");
} else{
NSLog(@"请求完成, 数据接收完毕");
}
}
/**
* 每当写入数据到临时文件时,就会调用一次(会调用多次)
* @param bytesWritten 这次写入的大小
* @param totalBytesWritten 已经写入的总大小
* @param totalBytesExpectedToWrite 总大小
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
NSLog(@"------%f", 1.0 * totalBytesWritten / totalBytesExpectedToWrite);
}
/**
* 下载完毕会调用一次这个方法
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
// 文件将来存放的地址
// suggestedFilename 服务器中的文件名
NSString *file = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
// 剪切location路径下的临时文件到以后文件存放的地址
NSFileManager *mgr = [NSFileManager defaultManager];
[mgr moveItemAtURL:location toURL:[NSURL fileURLWithPath:file] error:nil];
}