IOS 开发 NSURLConnection使用大全(包括请求,上传,下载)详解

本文详细讲解了iOS中使用NSURLConnection进行网络请求的各个方面,包括发送GET、POST请求,设置缓存策略、超时时间,以及文件上传等。还探讨了GET和POST请求的区别,并分析了文件上传的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络开发方案

在iOS中,常见的发送HTTP请求的方案包括:

  • 苹果官方

这里写图片描述

  • 第三方框架

这里写图片描述

NSURLConnection 在IOS9之后,已经被苹果废弃,取而代之的是iOS7之后出现的NSURLSession

1.NSURLConnection发送网络请求

这里写图片描述

1.设置URL NSURL:确定要访问的资源
2.创建请求 NSURLRequest:根据 URL 建立请求,向服务器索要数据
3.发送请求 NSURLConnection:建立网络连接,将请求发送给服务器
4.数据处理 response,data,error处理
- (void)viewDidLoad {
    [super viewDidLoad];

    // 1.URL : 注意,在客户端开发中,协议头一定要手写上去
    NSURL *URL= [NSURL URLWithString:@"http://www.baidu.com"];

    // 2.请求 (request)
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];

    // 3.发送请求--默认是GET请求
    /*
     参数1 : request
     参数2 : queue : 队列,并发队列,completionHandler所在的队列;如果你想在completionHandler里面刷新UI,队列需要时主队列
     参数3 : completionHandler : 请求之后,得到了响应体的回调,这个回调是在子线程执行的(异步回调)
            提示 : completionHandler 其实是在耗时操作执行结束之后回调
            提示  :sendAsynchronousRequest 是耗时的
     */
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {

        NSLog(@"%@",[NSThread currentThread]);
        /*
         response : 响应头
         data : 响应体(是程序猿需要的数据,二进制的)
         connectionError : 错误信息
        */

        //是服务器告诉客户端的额外信息
        NSLog(@"响应头 %@",response);
        // 响应体
        NSLog(@"响应体 %@",data);
         //错误信息
        NSLog(@"错误信息 %@",connectionError);

        // 错误处理
        if (connectionError == nil && data != nil && data.length > 0) {
            // 获取data
            // 4.处理响应 : 响应体就是程序猿需要的数据
            NSLog(@"%@",data);
        } else {
            NSLog(@"%@",connectionError);
        }

    }];
}

2.NSURLConnection请求缓存策略和超时时长

缓存策略:cachePolicy

    /*
     cachePolicy : 缓存策略
     NSURLRequestUseProtocolCachePolicy = 0,    使用HTTP协议的默认缓存
     NSURLRequestReloadIgnoringLocalCacheData = 1,  忽略本地缓存,只加载"最新"网络数据 (股票)
     NSURLRequestReturnCacheDataElseLoad = 2,   优先加载缓存数据,如果没有缓存数据就加载最新的数据
     NSURLRequestReturnCacheDataDontLoad = 3,   只加载本地缓存数据 (离线APP / 离线地图)
     */
NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:0 timeoutInterval:15.0];

超时时长:timeoutInterval

  • 默认网络时长是 60 s
  • 建议超时时长 15~30 秒之间
  • SDWebImage 的默认超时时长是 15 秒
  • AFN 的默认超时时长是 60 秒

3.NSURLConnection可变请求NSMutableURLRequest

设置请求超时等待时间(超过这个时间就算超时,请求失败)- (void)setTimeoutInterval:(NSTimeInterval)seconds;

设置请求方法(比如GET和POST)- (void)setHTTPMethod:(NSString *)method;

设置请求体- (void)setHTTPBody:(NSData *)data;

设置请求头- (void)setValue:(NSString )value forHTTPHeaderField:(NSString )field;

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1.URL : 注意,在客户端开发中,协议头一定要手写上去
    NSURL *URL = [NSURL URLWithString:@"http://www.baidu.com"];

    // 2.创建可变的请求对象,可以告诉服务器一些你想告诉的额外信息
    NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:URL cachePolicy:0 timeoutInterval:15.0];

    // 可以设置请求方法 :
    // 提示 : 苹果的网络框架默认是GET请求
    requestM.HTTPMethod = @"GET";
//    requestM.HTTPMethod = @"POST";
//    requestM.HTTPMethod = @"HEAD";

    // 发送请求时,告诉服务器我的客户端是苹果设备 (User-Agent: iPhone AppleWebKit)
    [requestM setValue:@"iPhone AppleWebKit" forHTTPHeaderField:@"User-Agent"];

    // 3.发送请求
    // NSURLConnection : 默认是GET请求
    [NSURLConnection sendAsynchronousRequest:requestM queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {

        // 4.处理响应 : 响应体就是程序猿需要的数据 (错误处理)
        if (connectionError == nil && data != nil && data.length > 0) {

        } else {
            NSLog(@"%@",connectionError);
        }

    }];
}

4.NSURLConnection响应

此处不谈论状态行,只讨论响应头和响应体

  • 响应头 response

这里写图片描述

  • 响应体 data
    • data 服务器返回的二进制数据,程序员最关心的内容
    • 拿到响应体之后,无法直接使用,需要进行反序列化,转换成OC对象.
        // 4.处理响应 : 响应体就是程序猿需要的数据 (错误处理)
        if (connectionError == nil && data != nil && data.length > 0) {
            // data二进制数据不能直接展示在界面上,客户端无法直接展示/使用二进制数据,我们就需要进行数据解析,把二进制数据转换成客户端可以直接展示/使用的数据

            // 1. dataHTML5字符串类型的数据处理
            NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            // baseURL : 相对URL / 相对路径
            [weakSelf.myWebView loadHTMLString:html baseURL:URL];

            // 2. datajson类型的数据处理
            NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

        } else {
            NSLog(@"%@",connectionError);
        }

5.NSURLConnectionDataDelegate代理方法

//当接收到服务器的响应(连通了服务器)时会调用
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
//当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
//当服务器的数据加载完毕时就会调用
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
//请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)
-(void)connection:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值