• 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];
     
     
     
     
     
  • 相关阅读:
    day36 08-Hibernate抓取策略:批量抓取
    day36 07-Hibernate抓取策略:many-to-one上的抓取策略
    day36 06-Hibernate抓取策略:set集合上的抓取策略
    day36 05-Hibernate检索方式:离线条件查询
    day36 04-Hibernate检索方式:多表连接查询
    day36 03-Hibernate检索方式:排序、参数绑定、投影查询
    【收集】11款Linux数据恢复工具
    【收集】11款Linux数据恢复工具
    7个免费的Linux FTP客户端工具
    7个免费的Linux FTP客户端工具
  • 原文地址:https://www.cnblogs.com/zh-li/p/5418617.html
Copyright © 2020-2023  润新知