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);
  • 相关阅读:
    java8流处理,不生产博客,做个好博客的搬运工
    java.util.ConcurrentModificationException异常分析
    App登录状态维持
    tomcat没有发布maven项目依赖的本地jar包
    Json对象和Json字符串的区别
    java过滤关键词
    过滤3个字节以上的utf-8字符
    Incorrect string value: 'xF0x9Fx98x84xF0x9F
    SpringBoot配置属性之DataSource
    linux nohup命令使程序在后台运行的方法
  • 原文地址:https://www.cnblogs.com/zhwl/p/2876473.html
Copyright © 2011-2022 走看看