2012-11-14 15 views
6

私はRestKit 0.2に切り替えたばかりで、現在は基本的にAFHTTPClientである新しい "HttpClient"を使用しています。postPathのJSON応答AFHTTPClient

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": "... "" ユーザ名 ":" ..."}私はこのコードの行を有します。それと同じくらい簡単です。

0.2に切り替える前に、私が実行して応答したAPI_KEYキーを取得することができました:

[[RKClient sharedClient] post:@"https://stackoverflow.com/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

をしかし、今、私はそれを行うことができないと私はのNSLogを行う場合は、 responseObjectに、私が取得:

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

そして奇妙なことは、私がしなければということである。

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

私が現れて(NSStringの中で)JSONを持っています。

ので、2つの質問:

1)なぜHEXコードを示すresponseObjectはなく、実際にJSONレスポンスを印刷していますか?

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

ありがとうございます!

答えて

11

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

あなたが投稿進読み取り:

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

NSLogが何をしたいかを示した理由は、(私はここで間違っているのであれば、私を修正)%@フォーマット文字列が記述を呼び出すことですオブジェクトを渡すとNSDataおそらくそれが下の文字列であることを知っている。

ですから、JSONの入手方法について説明します。それは本当にむしろ単純です。あなたのレスポンスオブジェクトを持っていたら、このような何かを行うことができます。これはあなたのために何をするか

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

は、使用が辞書にJSON内のルートオブジェクトとし、各値を符号化NSDictionaryを返すありますNSString,NSNumber,NSArray,NSDictionaryまたはNSNullであることが好ましい。詳細については、NSJSONSserializationを参照してください。

NSJSONReadingMutableContainersは、辞書と配列を変更可能にします。それは私のコードから残っているだけです。

あなたがiOS 5以降を使用している場合や、解析に別の解決策を見つける必要があることを願います。

+2

これは正解ですが、少なくともAFNetworkingのlibでは@ phix23のほうが優れていると思います。 ;) – Kjuly

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]; 
+2

+1は、AFNetworkingを使用しています。これを受け入れるべきです。 – Kjuly

+1

これが助けてくれました。 –

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"] 
}