zoukankan      html  css  js  c++  java
  • iOS使用NSURLConnection发送同步和异步HTTP Request

    1. 同步发送

    - (NSString *)sendRequestSync
    {
        // 初始化请求, 这里是变长的, 方便扩展
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    
        // 设置
        [request setURL:[NSURL URLWithString:urlStr]];
        [request setHTTPMethod:@"POST"];
        [request setValue:host forHTTPHeaderField:@"Host"];
        NSString *contentLength = [NSString stringWithFormat:@"%d", [content length]];
        [request setValue:contentLength forHTTPHeaderField:@"Content-Length"];
        [request setHTTPBody:content];
    
        // 发送同步请求, data就是返回的数据
        NSError *error = nil;
        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
        if (data == nil) {
            NSLog(@"send request failed: %@", error);
            return nil;
        }
    
        NSString *response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"response: %@", response);
        return response;
    }

    2.异步发送

    1) 使用delegate的方式:

    - (void)sendRequestAsync
    {
        // 初始化请求
        NSMutableURLRequest  *request = [[NSMutableURLRequest alloc] init];
    
        // 设置
        [request setURL:[NSURL URLWithString:urlStr]];
        [request setCachePolicy:NSURLRequestUseProtocolCachePolicy]; // 设置缓存策略
        [request setTimeoutInterval:5.0]; // 设置超时
    
        //......
    
        receivedData = [[NSMutableData alloc] initData: nil];
    
        NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request     delegate:self];
        if (connection == nil) {
            // 创建失败
            return;
        }
    }

    异步发送使用代理的方式, 需要实现以下delegate接口:

    // 收到回应
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {    
        NSLog(@"receive the response");
        // 注意这里将NSURLResponse对象转换成NSHTTPURLResponse对象才能去
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
        if ([response respondsToSelector:@selector(allHeaderFields)]) {
            NSDictionary *dictionary = [httpResponse allHeaderFields];
            NSLog(@"allHeaderFields: %@",dictionary);
        }
        [receivedData setLength:0];
    }    
    
    // 接收数据   
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data    
    {
        NSLog(@"get some data");
        [receivedData appendData:data];    
    }
    
    // 数据接收完毕
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection    
    {
        NSString *results = [[NSString alloc]
                             initWithBytes:[receivedData bytes]
                             length:[receivedData length]
                             encoding:NSUTF8StringEncoding];
    
        NSLog(@"connectionDidFinishLoading: %@",results);
    }
     
    // 返回错误
    -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error    
    {   
        NSLog(@"Connection failed: %@", error);        
    }    

    2) iOS 5.0版本新增异步发送接口:

    + (void)sendAsynchronousRequest:(NSURLRequest *)request
                              queue:(NSOperationQueue*) queue
                  completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*)) handlerNS_AVAILABLE(10_7, 5_0);
    花开花谢春不管,水暖水寒鱼自知.
  • 相关阅读:
    追随自己的价值观:用研经理 Anne Diaz 职业探索之路
    语义化版本(SemVer)的范围
    git如何放弃所有本地修改
    将本地已有的一个项目上传到新建的git仓库的方法
    using supervisord to run lsyncd script
    sersync下载安装及配置(有演示示例)
    sersync+rsync原理及部署
    Rsync+sersync 实现数据实时同步
    在分屏浏览中并排使用两个 Mac App
    MacOS 安装 Astah Professional 7.2
  • 原文地址:https://www.cnblogs.com/taintain1984/p/3405298.html
Copyright © 2011-2022 走看看