如何在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
相关产品推荐
相关产品推荐

