• 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:nilerror:&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);
  • 相关阅读:
    摄像头调试
    OpenGL学习记录
    Ubuntu使用操作记录/笔记
    ROS学习材料/链接
    ubuntu14 16使用libusb过程中遇到的问题及解决方法
    nodejs: 版本常识
    JS:Html事件处理程序 vs DOM0级事件处理程序 vs DOM2级事件处理程序
    网站性能优化(一)
    Css布局:左边固定,右边自适应
    css实现显示隐藏的5种方法
  • 原文地址:https://www.cnblogs.com/zhwl/p/2876473.html
Copyright © 2020-2023  润新知