如何读取HEAD请求的HTTP状态代码

问题描述

我正在请求使用AFNetworking 4.3.1和Http方法 GET HEAD 的API。它可能会返回不同的http状态代码(100、200、402等)

我的获取功能请求正常运行。

-(void) getApiV2:(NSString *)url
      parameters:(NSDictionary *)param
         success:(successBlock)mSuccessBlock
         failure:(failureBlock)mfailureBlock{

    NSMutableDictionary *httpHeader =[NSMutableDictionary dictionary];
    if(TOKEN !=nil){
        [httpHeader setObject:TOKEN forKey:@"Token"];
    }

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager
        GET:url
        parameters:param
        headers:httpHeader
        progress:nil
        success: ^(NSURLSessionDataTask * _Nonnull task,id  _Nullable responseObject){
            int statusCode = [[responseObject objectForKey:@"code"] intValue];
            NSArray *data = [responseObject objectForKey:@"data"];
            BLOCK_SAFE_RUN(mSuccessBlock,data,statusCode);
        }
        failure: ^(NSURLSessionDataTask * dataTask,NSError * error){
            BLOCK_SAFE_RUN(mfailureBlock,error);
        }
    ];
};

但是我的 head 函数抛出错误。

-(void) head:(NSString *)url success:(successBlock)mSuccessBlock failure:(failureBlock)mfailureBlock{

    NSMutableDictionary *httpHeader =[NSMutableDictionary dictionary];
    if(TOKEN !=nil){
        [httpHeader setObject:TOKEN forKey:@"Token"];
    }

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager
        HEAD:url
        parameters:nil
        headers:httpHeader
        success: ^(id _Nullable responseObject){
            int statusCode = [[responseObject objectForKey:@"code"] intValue];
            BLOCK_SAFE_RUN(mSuccessBlock,responseObject,error);
        }
    ];
};

在运行时,我在int statusCode = [[responseObject objectForKey:@"code"] intValue];行上出现此错误

[__ NSCFLocalDataTask objectForKey:]:无法识别的选择器已发送到实例0x110f88860

服务器正确处理请求并执行请求。


我尝试其他语法:

int statusCode = (int) [responseObject statusCode];

“ NSInvalidArgumentException”,原因:“-[__ NSCFLocalDataTask statusCode]:无法识别的选择器已发送到实例0x145731af0”

来自SO

            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)responseObject;
            int statusCode = (int) httpResponse.statusCode;

[__ NSCFLocalDataTask statusCode]:无法识别的选择器已发送到实例0x129665ed0


通过AFNetworking获取 HEAD 请求的http状态代码的好方法是什么?

解决方法

@Larme建议并得到source code of AFNetworking的确认,HEAD:parameters:headers:success:failure:返回NSURLSessionDataTask

因此,我需要先获取NSHTTPURLResponse才能获得statusCode

NSURLSessionTask *task = (NSURLSessionTask *)responseObject;
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)[task response];
int statusCode = (int) httpResponse.statusCode;
NSLog(@"Status code: %d",statusCode);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...