You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AFNetworking 4.3.1中获取HEAD请求的HTTP状态码

在AFNetworking 4.x中正确获取HEAD请求的HTTP状态码

你遇到的问题核心是AFNetworking中HEAD请求的success回调参数和GET请求完全不一样!

看AFNetworking的HEAD方法定义就会发现:它的success回调第一个参数是NSURLSessionDataTask *task,而非你以为的响应体对象——这就是为什么你拿到的responseObject实际上是__NSCFLocalDataTask实例,调用objectForKey:或者statusCode都会触发"unrecognized selector"错误。

正确的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: ^(NSURLSessionDataTask *task){
        // 从task的response中解析HTTP响应对象
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)task.response;
        int statusCode = (int)httpResponse.statusCode;
        
        // 如果需要获取响应头,可以通过allHeaderFields拿到
        NSDictionary *responseHeaders = httpResponse.allHeaderFields;
        
        BLOCK_SAFE_RUN(mSuccessBlock, responseHeaders, statusCode);
    } failure: ^(NSURLSessionDataTask *dataTask, NSError *error){
        BLOCK_SAFE_RUN(mfailureBlock, error);
    }];
};

补充说明

  • GET请求的success回调是^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject),所以能拿到解析后的业务响应体;
  • 但HEAD请求遵循HTTP协议规范,不会返回响应体,只返回响应头和状态码。因此AFNetworking的HEAD方法只在success回调里提供task参数,你需要从task.response中取出NSHTTPURLResponse对象,才能获取到HTTP状态码(比如100、200、402)和响应头信息。

另外要区分开:HTTP状态码是协议层面的状态标识,而你GET请求里从响应体取的code是业务自定义的状态码——HEAD请求没有业务响应体,所以只能拿到HTTP状态码。

内容的提问来源于stack exchange,提问作者europrimus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:22:57