task的三个函数
- (void)suspend;//暂停 - (void)resume;//开始或者恢复 - (void)cancel;//关闭任务NSURLSession其他请求示例
1.)post请求
// 1、创建URL资源地址
NSURL *url = [NSURL URLWithString:@"http://www.easck.com/postBody"];
// 2、创建Reuest请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 3、配置Request
// 设置请求超时
[request setTimeoutInterval:10.0];
// 设置请求方法
[request setHTTPMethod:@"POST"];
// 设置头部参数
[request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
// 4、构造请求参数
// 4.1、创建字典参数,将参数放入字典中,可防止程序员在主观意识上犯错误,即参数写错。
NSDictionary *parametersDict = @{@"name":@"yanzhenjie",@"pwd":@"123"};
// 4.2、遍历字典,以“key=value&”的方式创建参数字符串。
NSMutableString *parameterString = [[NSMutableString alloc]init];
int pos =0;
for (NSString *key in parametersDict.allKeys) {
// 拼接字符串
[parameterString appendFormat:@"%@=%@", key, parametersDict[key]];
if(pos<parametersDict.allKeys.count-1){
[parameterString appendString:@"&"];
}
pos++;
}
// 4.3、NSString转成NSData数据类型。
NSData *parametersData = [parameterString dataUsingEncoding:NSUTF8StringEncoding];
// 5、设置请求报文
[request setHTTPBody:parametersData];
// 6、构造NSURLSessionConfiguration
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 7、创建网络会话
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
// 8、创建会话任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 10、判断是否请求成功
if (error) {
NSLog(@"post error :%@",error.localizedDescription);
}else {
// 如果请求成功,则解析数据。
id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
// 11、判断是否解析成功
if (error) {
NSLog(@"post error :%@",error.localizedDescription);
}else {
// 解析成功,处理数据,通过GCD获取主队列,在主线程中刷新界面。
NSLog(@"post success :%@",object);
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新界面...
});
}
}
}];
// 9、执行任务
[task resume];
2.)附带表单参数文件上传
NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];
NSTimeInterval a=[dat timeIntervalSince1970];
NSString* fileName = [NSString stringWithFormat:@"file_%0.f.txt", a];
[FileUtils writeDataToFile:fileName data:[@"upload_file_to_server" dataUsingEncoding:NSUTF8StringEncoding]];
// 以流的方式上传,大小理论上不受限制,但应注意时间
// 1、创建URL资源地址
NSURL *url = [NSURL URLWithString:@"http://www.easck.com/upload"];
// 2、创建Reuest请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 3、配置Request
//设置Body值方法二,这种方法比较原始,不常用,不过可以用来上传参数和文件
NSString *BOUNDARY = @"whoislcj";//表单分界线 可以自定义任意值
[request setValue:[@"multipart/form-data; boundary=" stringByAppendingString:BOUNDARY] forHTTPHeaderField:@"Content-Type"];
// 文件上传使用post
[request setHTTPMethod:@"POST"];
// 设置请求超时
[request setTimeoutInterval:30.0f];
//用于存放二进制数据流
NSMutableData *body = [NSMutableData data];
//追加一个普通表单参数 name=yanzhenjie
NSString *nameParam = [NSString stringWithFormat:@"--%@rnContent-Disposition: form-data; name="%@"rnrn%@rn",BOUNDARY,@"name",@"yanzhenjie",nil];
[body appendData:[nameParam dataUsingEncoding:NSUTF8StringEncoding]];
//追加一个普通表单参数 pwd=123
NSString *pwdParam = [NSString stringWithFormat:@"--%@rnContent-Disposition: form-data; name="%@"rnrn%@rn",BOUNDARY,@"pwd",@"123",nil];
[body appendData:[pwdParam dataUsingEncoding:NSUTF8StringEncoding]];
//追加一个文件表单参数
// Content-Disposition: form-data; name="<服务器端需要知道的名字>"; filename="<服务器端这个传上来的文件名>"
// Content-Type: application/octet-stream --根据不同的文件类型选择不同的值
NSString *file = [NSString stringWithFormat:@"--%@rnContent-Disposition: form-data; name="%@";filename="%@"rnContent-Type: application/octet-streamrnrn",BOUNDARY,@"headUrl",fileName,nil];
[body appendData:[file dataUsingEncoding:NSUTF8StringEncoding]];
//获取file路径
NSString *filePath =[FileUtils getFilePath:fileName];
NSData *data =[NSData dataWithContentsOfFile:filePath];
//追加文件二进制数据
[body appendData:data];
[body appendData:[@"rn" dataUsingEncoding:NSUTF8StringEncoding]];
//结束分割线
NSString *endString = [NSString stringWithFormat:@"--%@--",BOUNDARY];
[body appendData:[endString dataUsingEncoding:NSUTF8StringEncoding]];
// 创建会话
NSURLSession *session = [NSURLSession sharedSession];
// 3.开始上传 request的body data将被忽略,而由fromData提供
NSURLSessionUploadTask *uploadTask= [session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"upload error:%@",error);
} else {
NSLog(@"upload success:%@", [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error]);
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新界面...
});
}
}];
//执行任务
[uploadTask resume];










