1

我试图通过子类化 AFHTTPClient 并设置基本路径来实现 AFNetworking 客户端

#define WineAPIBaseURLString @"http://localhost:3000/"
@implementation WineAPIClient

+(id)sharedInstance{
  static WineAPIClient *__sharedInstance;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    __sharedInstance = [[WineAPIClient alloc]initWithBaseURL:[NSURL URLWithString:WineAPIBaseURLString]];
});
return __sharedInstance;
}

- (id)initWithBaseURL:(NSURL *)url
{
 self = [super initWithBaseURL:url];
if(self){
    [self setParameterEncoding:AFJSONParameterEncoding];
    [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
}

return self;
}

@end

现在在我的视图控制器中调用客户端给了我奇怪的结果。例如下面的代码:

[[WineAPIClient sharedInstance] getPath:@"wines"
                               parameters:nil
                               success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                        NSLog(@"%@", responseObject);

                               }
                               failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                        NSLog(@"Error fetching wines!");
                                        NSLog(@"%@",error);
                               }];

它正在登录控制台一堆数字:

2013-03-11 16:25:36.411 AFNetworking4[1934:1260b] GET 'http://localhost:3000/wines'
2013-03-11 16:25:36.430 AFNetworking4[1934:f803] <5b0a2020 7b0a2020 2020225f 5f76223a    20302c0a 20202020 225f6964 223a2022 35313131 35656235 37356265 35383766 3034303...
2013-03-11 16:25:36.429 AFNetworking4[1934:13003] 200 'http://localhost:3000/wines' [0.0173 s]

如何更正客户端以正确解析 JSON?客户端实现是否有任何错误?

需要注意的一件事是,在不使用自定义客户端时,完全相同的 URI 可以正常工作。

IE:

NSURL *url = [NSURL URLWithString:@"http://localhost:3000/wines"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    NSLog(@"%@",JSON);
} failure:nil];
[operation start];

我正在使用 AFNetworking 的 0.10.1 分支(我必须支持 4.x 设备,所以我无法升级......)。

任何想法如何纠正?

非常感谢。

4

2 回答 2

1

谢谢,没错...我收到的是 NSData 而不是解析的 JSON。完全错过了关于这部分的文档信息

这些内容类型仅在以下情况下作为请求的响应对象返回:1) HTTP 客户端已使用 - registerHTTPOperationClass: 注册了适当的 AFHTTPRequestOperation 子类,并且 2) 请求 Accept HTTP 标头适合所请求的内容类型。不这样做可能会导致获取方法的成功或失败回调块的 NSData 实例,例如 getPath:parameters:success:failure。因此,要使用 JSON 数据,例如,在初始化 HTTP 客户端时执行 [client registerHTTPOperationClass: [AFJSONRequestOperation class]] 和 [client setDefaultHeader:@"Accept" value:@"application/json"]。

因此,修复只是将Accept application/json默认标头添加到客户端。

于 2013-03-12T15:22:17.947 回答
1

AFJSONParamterEncoding唯一影响您通过请求传递的参数。看起来您正在接收编码为 NSData 的数据。您可以尝试创建一个 NSString ,initWithData然后将其记录下来。您可能还想确保您的客户端返回实际的 JSON。在红宝石中,这可能需要一种to_json方法。

于 2013-03-12T00:58:46.520 回答