美文网首页
网络编程(02)NSURLSession

网络编程(02)NSURLSession

作者: Rui哥 | 来源:发表于2018-03-13 06:55 被阅读8次
    task类的结构.png

    一 基本的 NSURLSession 请求

    • NSURLSession GET (1)
    -(void)session_get{
        
        // 1.设置路径
        NSString *urlStr = @"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=12345";
        NSURL *url = [NSURL URLWithString:urlStr];
        // 2.创建请求
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        //3.创建一个会话对象 session
        NSURLSession  *session = [NSURLSession sharedSession];
        
        // 4.设置一个任务
        /** 说明文字
         request 请求对象
         data 相应的数据
         response 相应头
         error 错误
         */
    // 因为没有设置队列,系统默认在子线程中调用
        NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            
        }];
        
        //5. 开始任务
        [dataTask resume];
    }
    
    • NSURLSession GET (2)
    -(void)session_get{
        
        // 1.设置路径
        NSString *urlStr = @"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=12345";
        NSURL *url = [NSURL URLWithString:urlStr];
        // 2.创建请求
        //3.创建一个会话对象 session
        NSURLSession  *session = [NSURLSession sharedSession];
        
        // 4.设置一个任务
       // 这个方法内部会自动创建请求头
    // 因为没有设置队列,系统默认在子线程中调用
        NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            
        }];
        
        //5. 开始任务
        [dataTask resume];
    }
    
    • NSURLSession POST
    -(void)session_POST{
        
        // 1.设置路径
        NSString *urlStr = @"http://120.25.226.186:12345/logo";
        NSURL *url = [NSURL URLWithString:urlStr];
        // 2.创建请求
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        
        //3. 设置请求的方法
        request.HTTPMethod = @"POST";
        //4. 设置请求体
        request.HTTPBody = [@"usr=zhangsan&pwd=12345" dataUsingEncoding:NSUTF8StringEncoding];
        //3.创建一个会话对象 session
        NSURLSession  *session = [NSURLSession sharedSession];
        
        // 4.设置一个任务
        /** 说明文字
         request 请求对象
         data 相应的数据
         response 相应头
         error 错误
         */  
    // 因为没有设置队列,系统默认在子线程中调用
      NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            
        }];
        
        //5. 开始任务
        [dataTask resume];
    }
    

    三 基本的 NSURLSession 请求

    • GET请求和POST请求的区别?
    1> 最主要的区别就是对参数的处理上,get请求的参数和url在一起,post 请求url 和请求参数是分开的,请求参数是放在请求体里的.
    2> 请求参数的大小有区别,get 最多通常1kb, post 通常没有限制.
    3> post 请求必须要使用NSMutableURLRequest 
    具体URL格式如下:
    4> get 的url http://主机地址/路径?请求参数
    5> post的url   http://主机地址/路径
    
    • 请简单列出NSURLConnection发送一个异步POST请求的步骤?
    - 1 创建请求URL
    - 2 创建NSMutableRequest 
    - 3 设置request 方法 httpMethod
    - 4 发送请求
    
    • 请简单说明HTTP 请求的通行过程
    1> 通过url 的主机地址和端口号找到通行的目标 建立tcp 3次握手
    2> 客户端发送请求头和请求体(post)告诉服务器客户端的环境和请求的具体参数
    3> 服务端根据客户端的请求头和请求体做出具体的相应,首先回应响应头(服务器端的状态环境及将要传送的数据的格式).
    4> 客户端接收服务端的数据完成请求.
    
    • 请简单说下NSURLSession对比NSURLConnection 的优势
    1> session 支持http2.0 协议(iOS9.0+)
    2> 在处理下载任务的时候可以直接把数据下载到磁盘
    3> 支持后台下载 | 上传 (NSURLConnection 是无法实现的)
    4> 同一个session 发送多个请求,只需要建立一次连接(复用了tcp)
    5> 提供了全局的session 并且可以统一配置,使用更加方便
    6>下载的时候是多线程异步处理的效率更高
    
    • 请简单列出NSURLSession 发送POST的简单步骤?
    1> 创建请求URL
    2> 创建NSMutableURLRequest 请求
    3> 设置request 请求的方法 HttpMethod
    4> 设置request的请求体 httpBody
    5> 创建NSURLSession, [NSURLSession shareSession]
    6> 使用session 创建一个dataTask 任务
    7> [dataTask resume]  发出请求
    
    • 使用NSURLSession 发送网络请求时,最多可以建立多少个Tcp连接
    1> 在iOS中最多建立4个tcp连接,osX中最多可以建立6个连接.
    2> 在iOS中,NSURLSessionConfiguration 中 HTTPMaximumConnectionsPerHost 用来设置最大连接主机数 有说明 //The default value is 6 in macOS, or 4 in iOS.;
    
    说明: 
    1>由于HTTP/1.1 不支持多路复用,因此如果要处理多个网络请求,在处理http请求的时候,多数浏览器厂商都是不假思索的就在客户端排队所有的HTTP请求,然后通过一个持久连接,一个接着一个的发送这些请求.然而这种方式实在太差.实际上,浏览器开发商对于此性能问题,尚没有任何更好的办法,因此只能允许客户端并行打开多个tcp连接会话.但是具体最多可以打开多少个tcp连接是有数量限制的.多数现代浏览器,包括桌面和移动浏览器,都支持打开6个连接,即客户端对多可以并发分派6个请求,服务器可以并发处理6个请求.
    
    2> 为什么是6个连接? 有什么特殊含义吗?
    其实这个数字是多方平衡后的结果,这个数字越大,便能带来更多的并行能力,但同样的客户端和服务端占用的资源也会越多.因此主机6个只是大家觉得比较安全能够接受的一个数字而已.
    
    
    

    相关文章

      网友评论

          本文标题:网络编程(02)NSURLSession

          本文链接:https://www.haomeiwen.com/subject/bslbfftx.html