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を正しく解析するようにクライアントを修正するにはどうすればよいですか?クライアントの実装に間違いはありますか?

注意すべき点の1つは、カスタムクライアントを使用していない場合、まったく同じ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

リクエストで渡すパラメータにAFJSONParamterEncodingのみ影響します。NSDataとしてエンコードされたデータを受信して​​いるようです。を使用してNSStringを作成しinitWithData、それをログに記録することができます。また、クライアントが実際のJSONを返していることを確認することもできます。ルビーでは、これにはおそらくto_jsonメソッドが必要です。

于 2013-03-12T00:58:46.520 に答える
1

ありがとう、そうです...解析されたJSONの代わりにNSDataを受け取っていました。この部分に関するドキュメント情報を完全に見逃しました

これらのコンテンツタイプは、1)HTTPクライアントが適切なAFHTTPRequestOperationサブクラスを--registerHTTPOperationClass:に登録し、2)リクエストのAcceptHTTPヘッダーがリクエストされたコンテンツタイプに適している場合にのみリクエストの応答オブジェクトとして返されます。これを行わないと、getPath:parameters:success:failureなどのメソッドの成功または失敗のコールバックブロックのNSDataインスタンスが取得される可能性があります。したがって、JSONデータを操作するには、たとえば、HTTPクライアントを初期化するときに[client registerHTTPOperationClass:[AFJSONRequestOperationclass]]と[clientsetDefaultHeader:@ "Accept" value:@ "application/json"]を実行します。

そのため、修正は、Accept application/jsonのデフォルトヘッダーをクライアントに追加するだけでした。

于 2013-03-12T15:22:17.947 に答える