2012-11-14 35 views
6

Vì vậy, tôi vừa chuyển sang RestKit 0.2 và hiện tôi đang sử dụng "HttpClient" mới về cơ bản là AFHTTPClient. Tôi có dòng mã này:Phản hồi JSON trong postPath 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 này trả về trả lời JSON dưới dạng: {"api_key": "...."} "username": "...."}. Đơn giản vậy thôi.

Trước khi chuyển sang 0.2, tôi đã có thể để có được chìa khóa API_KEY trong phản ứng bằng cách thực hiện:

[[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

Nhưng bây giờ, tôi không thể làm điều đó và nếu tôi làm một NSLog trên responseObject, tôi nhận được:

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

Và điều kỳ lạ là nếu tôi làm:

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

tôi có JSON (trong NSString) hiển thị.

Vì vậy, hai câu hỏi:

1) Tại sao in responseObject hiển thị cho tôi mã HEX, và không phải là thực sự JSON phản ứng?

2) Tại sao nếu tôi hoạt động.responseString nó đang hiển thị đối tượng phản hồi thực tế? Có cách nào để có được dữ liệu thực tế trong ResponseObject sau khi được phân tích cú pháp từ JSON?

Cảm ơn!

Trả lời

11

Điều bạn đang thấy, nếu tôi không nhầm, là các byte thô từ NSData được cung cấp cho bạn khi khối thành công của bạn được gọi.

Các hex bạn được đăng lần đọc:

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

Lý do thứ hai NSLog cho bạn thấy những gì bạn muốn là chuỗi định dạng %@ gọi là mô tả (chính xác cho tôi nếu tôi sai ở đây, SO) của đối tượng bạn vượt qua nó và NSData có thể biết đó là một chuỗi bên dưới.

Vì vậy, về cách lấy JSON. Nó thực sự khá đơn giản. Một khi bạn có đối tượng trả lời của bạn, bạn có thể làm một cái gì đó như thế này:

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

Điều này sẽ làm cho bạn là sử dụng trở lại một NSDictionary mã hóa các đối tượng gốc trong JSON và sau đó mỗi giá trị trong từ điển sẽ thuộc loại NSString, NSNumber, NSArray, NSDictionary hoặc NSNull. Xem NSJSONSserialization để biết tài liệu.

NSJSONReadingMutableContainers làm cho từ điển và mảng có thể thay đổi. Nó chỉ còn sót lại từ mã của tôi.

Hy vọng bạn đang sử dụng iOS 5 trở lên hoặc bạn sẽ cần phải tìm một giải pháp khác để phân tích cú pháp.

+2

Mặc dù đây là một câu trả lời đúng, nhưng tôi nghĩ rằng @ phix23 là tốt hơn, ít nhất là cho AFNetworking lib. ;) – Kjuly

17

AFNetworking sẽ khởi tạo AFJSONRequestOperation. Có lẽ nó tạo ra một cơ bản AFHTTPRequestOperation thay vào đó (kiểm tra [operation class]) dẫn đến một đối tượng NSData như là phản ứng.

Hãy chắc chắn rằng bạn đăng ký lớp hoạt động trong phương thức init của AFHTTPClient lớp con của bạn (initWithBaseURL):

[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"]; 

Bạn cũng có thể thử sử dụng AFJSONRequestOperation trực tiếp như thế này:

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 cho quyền sử dụng AFNetworking. Nên chấp nhận điều này. – Kjuly

+1

điều này đã giúp, thx rất nhiều –

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"] 
} 
Các vấn đề liên quan