【问题标题】:How to read http status code for HEAD request如何读取 HEAD 请求的 http 状态码
【发布时间】:2023-03-28 04:16:01
【问题描述】:

我正在请求一个带有 AFNetworking 4.3.1 和 Http 方法 GETHEAD 的 API。它可以返回不同的http状态码(100、200、402、..)

我的 get 函数请求工作正常。

-(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,statusCode);
        }
        failure: ^(NSURLSessionDataTask * dataTask, NSError * error){
            BLOCK_SAFE_RUN(mfailureBlock,error);
        }
    ];
};

在运行时,我在int statusCode = [[responseObject objectForKey:@"code"] intValue]; 行有这个错误

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

服务器正确处理请求并完成工作。


我尝试其他语法:

int statusCode = (int) [responseObject statusCode];

'NSInvalidArgumentException',原因:'-[__NSCFLocalDataTask statusCode]: unrecognized selector sent to instance 0x145731af0'

来自SO

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

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


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

【问题讨论】:

  • responseObjectNSCFLocalDataTask,我猜应该是URLSessionTask。尝试先打印它。 NSLog(@"Response tasks: %@", responseObject); 但是,就是这样:URLSessionTask *task = (URLSessionTask *)responseObject; NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)[task response]; int statusCode = (int) httpResponse.statusCode;
  • @Larme,感谢您的帮助。现在它与 `NSURLSessionTask *task = (NSURLSessionTask *)responseObject; NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)[任务响应]; int statusCode = (int) httpResponse.statusCode; NSLog(@"Status code: %d", statusCode);`你可以写一个答案让我批准。

标签: ios objective-c afnetworking


【解决方案1】:

根据@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);

【讨论】:

    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2016-08-06
    • 2012-03-09
    相关资源
    最近更新 更多