6

RestKit 0.2に切り替えたばかりで、現在、基本的にAFHTTPClientである新しい「HttpClient」を使用しています。私はこのコード行を持っています:

RKObjectManager* objectManager = [RKObjectManager sharedManager];
NSDictionary* params = [[NSDictionary alloc] initWithObjectsAndKeys: login, @"username", password, @"password", nil];

[[objectManager HTTPClient]postPath:@"users/login/?format=json" parameters:params
    success:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        //reponseObject vs operation.response
        NSLog(@"%@", responseObject);
    }
    failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
        NSLog(@"ERROR");
    }];

このPOST呼び出しは、次の形式でJSON応答を返します:{"api_key": "...."、 "username":"...."}。それと同じくらい簡単です。

0.2に切り替える前に、次のようにして、応答でapi_keyキーを取得できました。

 [[RKClient sharedClient] post:@"/users/login/?format=json" usingBlock:^(RKRequest *request)
 {
    request.onDidLoadResponse = ^(RKResponse *response)
    {
        id parsedResponse = [response parsedBody:NULL];
        NSString *apiKey = [parsedResponse valueForKey:@"api_key"];
    }
  }.....];

http://restkit.org/api/master/Classes/RKResponse.html

しかし、今はそれができません。responseObjectでNSLogを実行すると、次のようになります。

<7b227265 61736f6e 223a2022 41504920 4b657920 666f756e 64222c20 22617069 5f6b6579 223a2022 61356661 65323437 66336264 35316164 39396338 63393734 36386438 34636162 36306537 65386331 222c2022 73756363 65737322 3a207472 75657d>

そして奇妙なことは、私がそうするなら、それです:

        NSLog(@"%@", operation.responseString);

JSON(NSString)が表示されています。

したがって、2つの質問:

1)実際のJSON応答ではなく、HEXコードを表示するresponseObjectを出力するのはなぜですか?

2)operation.responseStringを実行すると、実際の応答オブジェクトが表示されるのはなぜですか?JSONから解析された後、ResponseObjectで実際のデータを取得する方法はありますか?

4

3 に答える 3

17

AFNetworkingはをインスタンス化する必要がありますAFJSONRequestOperation。おそらく、AFHTTPRequestOperation代わりに基本を作成し(チェック[operation class])、応答としてNSDataオブジェクトを生成します。

AFHTTPClientサブクラス(initWithBaseURL)のinitメソッドに操作クラスを登録してください。

[self registerHTTPOperationClass:[AFJSONRequestOperation class]];

// Accept HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
[self setDefaultHeader:@"Accept" value:@"application/json"];

次のように、AFJSONRequestOperationを直接使用することもできます。

NSURLRequest *request = [[objectManager HTTPClient] requestWithMethod:@"POST" path:@"users/login/?format=json" parameters:params];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    NSLog(@"JSON: %@", JSON);
} failure:nil];
[[objectManager HTTPClient] enqueueHTTPRequestOperation:operation];
于 2012-12-01T11:08:07.567 に答える
11

私が間違っていなければ、あなたが見ているのは、成功ブロックが呼び出されたときに与えられるNSDataからの生のバイトです。

あなたが投稿したヘクスは次のようになります。

{"reason": "API Key found", "api_key": "a5fae247f3bd51ad99c8c97468d84cab60e7e8c1", "success": true}

NSLog2番目が必要なものを示している理由は、%@フォーマット文字列が、渡したオブジェクトの説明(ここで間違っている場合は訂正してください)を呼び出し、NSDataおそらくそれが下の文字列であることを知っているからです。

では、JSONを取得する方法について説明します。本当に簡単です。応答オブジェクトを取得したら、次のように実行できます。

NSDictionary* jsonFromData = (NSDictionary*)[NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:&error];

これがあなたのために何をするかはNSDictionary、JSONのルートオブジェクトをエンコードするreturn anを使用することです。そうすると、ディクショナリの各値は、、、、、、またはのタイプになりNSStringます。ドキュメントについては、 NSJSONSserializationを参照してください。NSNumberNSArrayNSDictionaryNSNull

NSJSONReadingMutableContainers、辞書と配列を変更可能にします。それは私のコードからの残り物です。

うまくいけば、iOS 5以降を使用しているか、解析のための別の解決策を見つける必要があります。

于 2012-12-01T06:25:35.993 に答える
3
success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSData *responseData = operation.HTTPRequestOperation.responseData;
    id parsedResponse = [RKMIMETypeSerialization objectFromData:responseData    MIMEType:RKMIMETypeJSON error:nil];
    NSString *apiKey = [parsedResponse valueForKey:@"api_key"]
}
于 2012-12-04T15:29:45.863 に答える