session发送的get请求、post请求、上传、下载

Http方法:Get请求与Post请求的区别
Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求
Get是获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改
Get请求的参数会跟在url后进行传递,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,%XX中的XX为该符号以16进制表示的ASCII,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密。
Get传输的数据有大小限制,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了,不同的浏览器对URL的长度的限制是不同的。
GET请求的数据会被浏览器缓存起来,用户名和密码将明文出现在URL上,其他人可以查到历史浏览记录,数据不太安全。在服务器端,用Request.QueryString来获取Get方式提交来的数据
Post请求则作为http消息的实际内容发送给web服务器,数据放置在HTML Header内提交,Post没有限制提交的数据。Post比Get安全,当数据是中文或者不敏感的数据,则用get,因为使用get,参数会显示在地址,对于敏感数据和不是中文字符的数据,则用post
POST表示可能修改变服务器上的资源的请求,在服务器端,用Post方式提交的数据只能用Request.Form来获取
 
一、get请求 Get请求的参数会跟在url后进行传递,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连
1.请求地址 url
    NSURL *url = [NSURL URLWithString:urlString];
   
2. 获取绝对路径与参数字符串之间的分隔符。判断URL是否已经带有参数,参数存在的话,后面填充@“&”
    NSString *str = url.query?@"&":@"?";
*3.获取参数字符串paramsString(字典转换成字符串,根据条件,该步可省略)
     NSMutableString *paramsString = [[NSMutableString alloc] init];
   
    for (NSString *key in params) {
    
        [paramsString appendFormat:@"%@=%@",key,[params objectForKey:key]];
       
        if (key != [[params allKeys] lastObject]) {
           
            [paramsString appendString:@"&"];
        }
       
    }
4. 获取请求的最终路径
    NSString *fullString = [urlString stringByAppendingFormat:@"%@%@",str,paramsString];
5.构造请求
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:fullString] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:60];//NSURLRequestCachePolicy 缓存策略
6.创建session
NSURLSessionConfiguration *cofiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:cofiguration];
7.创建任务(Data Task加载数据)
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
      
        if (error) {
             NSLog(@"请求失败");
        }
        // 将获取的数据从NSData换成JSON  id类型数据
        id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        
    }];
8. 开始执行任务
[task resume];
 
二、post请求 Post请求则作为http消息的实际内容发送给web服务器,数据放置在HTML Header内提交
1.请求地址 url
NSURL *url = [NSURL URLWithString:urlString];
2.构造网络请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
**获取参数字符串paramsString(字典转换成字符串,根据条件,该步可省略)
     NSMutableString *paramsString = [[NSMutableString alloc] init];
   
    for (NSString *key in params) {
    
        [paramsString appendFormat:@"%@=%@",key,[params objectForKey:key]];
       
        if (key != [[params allKeys] lastObject]) {
           
            [paramsString appendString:@"&"];
        }
       
    } **
 
NSData *dataBody = [paramsString dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPBody = dataBody;
    request.HTTPMethod = @"POST";
    request.timeoutInterval = 60;
 
3.创建session对象
    NSURLSession *session = [NSURLSession sharedSession];
   
4.创建任务(Data Task加载数据)
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@"请求失败");
            
        }
        // 解析json数据
        id jsonOb = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
       
    }];
   
5.开始任务
    [task resume];
 
三、下载任务
1.请求地址 url
2.创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10];
3.创建session
NSURLSessionConfiguration *cofiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
 
4.创建任务(Download Task用于完成下载文件的任务)
带有block回调 不会执行代理方法
    NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //loaction:下载文件的存储路径
        //当前获取到的文件 仅是临时文件 block调用完后文件被销毁
        NSLog(@"location:%@",location);
    }];
 
*4.创建任务 使用不带有block回调的下载任务创建  会执行代理方法
    downloadTask = [session downloadTaskWithRequest:request];
5.任务执行
    [downloadTask resume];
6.下载的暂停和继续(断点续传)
6.1暂停
[downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
           
            //将下载的数据保留
            _resumeData = resumeData;//全局,方便继续任务时找到继续下载的断点
            //销毁当前的下载任务
            downloadTask = nil;
        }];
 
6.2继续下载
downloadTask = [_session downloadTaskWithResumeData:_resumeData];
        //执行下载
        [downloadTask resume];
7. NSURLDownLoadDelegate的方法
7.1完成下载时调用该方法
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
    NSLog(@"下载完成 location:%@",location);
}

7.2下载时实时调用 可以计算下载进度
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    /*
     bytesWritten:本次下载的数据大小
     totalBytesWritten:当前总共下载的数据大小
     totalBytesExpectedToWrite:要下载文件的总大小
     */
   
    NSLog(@"当前下载进度:%.2f%%",(float)totalBytesWritten/(float)totalBytesExpectedToWrite*100);
   
}
 
四、上传任务
1.请求地址 url
NSURL *url = [NSURL URLWithString:@"https://upload.api.weibo.com/2/statuses/upload.json"]; //微博上上传图片接口
2.创建request请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10];
3.设置request请求
3.1 请求方式
request.HTTPMethod = @"POST";
3.2 请求头设置
[request setValue:@"multipart/form-data; boundary=wj"forHTTPHeaderField:@"Content-type"];
3.3 API所需参数
NSDictionary *parameters = @{@"access_token":@"2.00mJ342GxqpRWCefc4cfde8ecuw6YC",@"status":@"进进进进"};
3.4 要上传的文件( 将图片转化成二进制数据)
NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"jpg"];
NSData *imgData = [NSData dataWithContentsOfFile:path];
3.5 拼接请求体
NSString*preBoundary = [NSString stringWithFormat:@"--%@", @"wj"];
   
    NSString*endBoundary = [NSString stringWithFormat:@"--%@--",@"wj"];
   
   
    NSMutableString *body = [[NSMutableString alloc] init];
   
    //遍历keys
    for(NSString*key in parameters)
    {
        //得到当前key
       
        //如果key不是pic,说明value是字符类型,比如name:Boris
        //添加分界线,换行 必须使用 
        [body appendFormat:@"%@ ",preBoundary];
        //添加字段名称,换2行
        [body appendFormat:@"Content-Disposition: form-data; name="%@" ",key];
        //添加字段的值
        [body appendFormat:@"%@ ",[parameters objectForKey:key]];
       
    }
   
    ////添加分界线,换行
    [body appendFormat:@"%@ ",preBoundary];
    //声明pic字段,文件名为boris.png
    [body appendFormat:@"Content-Disposition: form-data; name="%@"; filename="%@" ", @"pic", @"pic.png"];
    //声明上传文件的格式
    [body appendFormat:@"Content-Type: %@ ", @"image/png"];
   
    //声明结束符:--wj--
    NSString *end=[[NSString alloc]initWithFormat:@" %@",endBoundary];
    //声明myRequestData,用来放入http body
   
   
    NSMutableData *myRequestData=[NSMutableData data];
    //将body字符串转化为UTF8格式的二进制
    [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
    //将image的data加入
    [myRequestData appendData:imgData];
    //加入结束符--wj--
    [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
 
3.6 设置请求体
    request.HTTPBody = formData;
4. 创建上传任务 (Upload Task用于完成上传文件任务)
    NSURLSessionUploadTask *upload = [_session uploadTaskWithRequest:request fromData:formData completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
       
        if (!error) {
            NSLog(@"上传完成");

        }
    }];
   
5.执行任务
    [upload resume];
 
 
 
 
 
原文地址:https://www.cnblogs.com/zh-li/p/5418617.html