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: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);
  • 相关阅读:
    ab 性能测试工具的使用(Web并发测试)
    java 读取文件——按照行取出(使用BufferedReader和一次将数据保存到内存两种实现方式)
    java 判断两个时间相差的天数
    java 正则表达式的应用:读取文件,获取其中的电话号码
    mybatis 插入数据时返回主键
    CodeForces 493B Vasya and Wrestling 【模拟】
    图像边缘检測小结
    【JS设计模式】温习简单工厂模式、工厂方法模式、抽象工厂模式概念
    60.自己定义View练习(五)高仿小米时钟
    bzoj4361 isn
  • 原文地址:https://www.cnblogs.com/zhwl/p/2876473.html
Copyright © 2011-2022 走看看