AFNetWorking 获取statusCode

这篇博客记录了在项目中使用AFNetworking 3.0的Session Task获取statusCode的问题及解决方案。通过介绍Data Task、Upload Task、Download Task三种类型的Task,展示了简单的使用Demo。在Download Task中,需要注意下载文件的临时存放位置以及如何转移到持久化目录。

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

最近做的项目中遇到这个问题,用3.0中的Session Task来获取这个问题困扰我好久,上周五找了好多资料终于解决了,着这里把问题记下:

2.0的方法,具体不多说了

operation.response.statusCode == 500

3.0正常获取的方法:

+ (AFHTTPSessionManager *)manager
{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer.timeoutInterval = kTimeOutInterval;
    manager.requestSerializer = [AFJSONRequestSerializer serializer]; // 上传JSON格式
    
    // 声明获取到的数据格式
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; // AFN会JSON解析返回的数据
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [manager.requestSerializer setValue:TOKEN forHTTPHeaderField:@"Authorization"];

    return manager;
}

//post
+ (void)httpPostRequest:(NSString *)url  Parameters:(NSDictionary *)params WithSuccess:(void (^)(id result))success failure:(void (^)(NSError *error))failure statusCode:(void (^)(NSInteger statusCode))statusCode
{
    AFHTTPSessionManager *manager = [self manager];
    [manager POST:url parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        /*注意:这里要强转下*/
        NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
        statusCode(responses.statusCode);
        NSLog(@"1111111111111111:%ld",    responses.statusCode );

        success(responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
           if (failure) {
               failure(error);
           }
    }];
}



Session Task获取:

Session Task分为三种Data Task,Upload Task,Download Task。毫无疑问,Session Task是整个NSURLSession架构的核心目标。

下面写了一个简单的Demo来初步使用下三种任务对象。这里使用的是convenience methods,并没有定制session和使用协议,都是采用completionHandler作为回调动作。

第一种Data Task用于加载数据,使用全局的shared session和dataTaskWithRequest:completionHandler:方法创建。

completionHandler指定任务完成后的动作。注意一定要使用resume方法启动任务。(Upload Task和Download Task同理)
+ (void)httpRequest:(NSString *)url
        RequestType:(NSString *)type
             Header:(NSDictionary *)headers
         Parameters:(NSDictionary *)params
        WithSuccess:(void (^)(id result))success 
            failure:(void (^)(NSError *error))failure
         statusCode:(void (^)(NSInteger statusCode))statusCode{
    AFHTTPSessionManager *manager = [self manager];
    
    for (NSString *key in [headers allKeys]) {
        [manager.requestSerializer setValue:[headers valueForKey:key] forHTTPHeaderField:key];
    }
    NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:type URLString:url parameters:params error:nil];
    
    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        NSHTTPURLResponse * responses = (NSHTTPURLResponse *)response;
       statusCode(responses.statusCode);
        if (success) {
            success(responseObject);
        }
        if (failure) {
            failure(error);
        }
    }];
    [dataTask resume];
}

第二种Upload Task用于完成上传文件任务,使用方法类似:

/* 使用NSURLSessionUploadTask上传文件 */
- (void)uploadFile:(id)sender {
    NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    NSData *data ;
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //.......
    }];
    [uploadTask resume];
}

第三种Download Task用于完成下载文件的任务,使用全局的shared session和downloadTaskWithRequest:completionHandler:方法创建。
注意:在下载任务完成后,下载的文件位于tmp目录下,由代码块中的location指定(不妨输出看看),我们必须要在completion handler中将文件放到持久化的目录下保存。

/* 使用NSURLSessionDownloadTask下载文件 */
- (void)downloadFile:(id)sender {
    NSURL *URL = [NSURL URLWithString:@"图片的地址.jpg"];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request                                                                                                             completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
           [self showResponseCode:response];
         // 输出下载文件原来的存放目录
          NSLog(@"%@", location);
         // 设置文件的存放目标路径
        NSString *documentsPath = [self getDocumentsPath];
        NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:documentsPath];
        NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:[[response URL] lastPathComponent]];
        // 如果该路径下文件已经存在,就要先将其移除,在移动文件
        NSFileManager *fileManager = [NSFileManager defaultManager];
        if ([fileManager fileExistsAtPath:[fileURL path] isDirectory:NULL]) {
            [fileManager removeItemAtURL:fileURL error:NULL];
         }
        [fileManager moveItemAtURL:location toURL:fileURL error:NULL];
         // 在webView中加载图片文件
        NSURLRequest *showImage_request = [NSURLRequest requestWithURL:fileURL];
        [self.webView loadRequest:showImage_request];
        [self.spinner stopAnimating];
        }];
        [downloadTask resume];  
}  	  
/* 获取Documents文件夹的路径 */  
- (NSString *)getDocumentsPath {  
        NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
        NSString *documentsPath = documents[0];  
        return documentsPath;  
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值