2012-02-01 29 views
18

Tôi mới phát triển iOS và tôi gặp sự cố khi thực hiện yêu cầu Json POST đơn giản. Tôi có một NSDictionary có chứa một người sử dụng và mật khẩu và tôi muốn gửi những giá trị như một Json đến một máy chủ và nhận được một phản ứng. Tôi đã làm việc đó mà không cần sử dụng bộ lưu trữ nhưng tôi không thể tìm ra cách để thực hiện tương tự bằng cách sử dụng RestKit và không thể tìm thấy một ví dụ tốt về những gì tôi muốn.Thực hiện một bài đăng đơn giản bằng cách sử dụng RESTKit

- (bool) login{ 

    NSMutableDictionary* params = [[NSMutableDictionary alloc] init]; 
    [params setValue:self.email forKey:@"email"]; 
    [params setValue:self.password forKey:@"password"];  

    NSMutableDictionary* rpcData = [[NSMutableDictionary alloc] init]; 
    [rpcData setValue:@"2.0" forKey:@"jsonrpc"]; 
    [rpcData setValue:@"authenticate" forKey:@"method"]; 
    [rpcData setValue:@"" forKey:@"id"]; 
    [rpcData setValue:params forKey:@"params"]; 

    [[RKClient sharedClient] post:@"/api/rpc/" params:rpcData delegate:self]; 
    return nil; 
} 

Các máy chủ được mong đợi một Json như thế này:

{ 
    jsonrpc : '2.0', 
    method : 'authenticate', // method name goes here 
    params : { // params are method-specific 
     email : '[email protected]', 
     password : 'secret' 
    }, 
    id : 2 // The id can be anything, it will be sent back with the response 
} 

Tôi hiểu rằng có một phân tích cú pháp JSON bao gồm trong RestKit nhưng tôi không thể tìm thấy bất kỳ tài liệu hướng dẫn về cách phân tích từ điển rpcData của tôi, tôi có cần sử dụng thư viện bên ngoài không ?.

Ngay bây giờ giao tiếp với máy chủ thì không sao, nhưng tôi không gửi những gì được mong đợi. Từ điển của tôi được ánh xạ theo cách "key = value? Key2 = value2 ...". Đây là câu hỏi rất ngớ ngẩn nhưng tôi bị mắc kẹt.

Cập nhật

Vào thời điểm tôi viết bài này, nó làm việc nhưng Restkit đã được cập nhật vì vậy tôi không chắc chắn nếu điều này sẽ làm việc, xin vui lòng kiểm tra giấy tờ của họ

Dưới đây là giải pháp cho vấn đề của tôi, những gì tôi đang làm là lý tưởng để làm việc với các API RPC khi bạn cần gọi một dịch vụ:

1. Trước tiên, bạn cần nhập Restkit và RKRequestSerialization, điều này rất quan trọng:

#import <RestKit/RestKit.h> 
#import <RestKit/RKRequestSerialization.h> 

@interface myObject : NSObject <RKRequestDelegate,RKObjectLoaderDelegate> 

2.- Dưới đây là chức năng đăng nhập gửi bài:

- (void) login:(NSString *)username :(NSString *)password{ 

    RKClient *myClient = [RKClient sharedClient]; 
    NSMutableDictionary *rpcData = [[NSMutableDictionary alloc] init ]; 
    NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; 

    //User and password params 
    [params setObject:password forKey:@"password"]; 
    [params setObject:username forKey:@"email"]; 

    //The server ask me for this format, so I set it here: 
    [rpcData setObject:@"2.0" forKey:@"jsonrpc"]; 
    [rpcData setObject:@"authenticate" forKey:@"method"]; 
    [rpcData setObject:@"" forKey:@"id"]; 
    [rpcData setObject:params forKey:@"params"]; 

    //Parsing rpcData to JSON! 
    id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:RKMIMETypeJSON]; 
    NSError *error = nil; 
    NSString *json = [parser stringFromObject:rpcData error:&error];  

    //If no error we send the post, voila! 
    if (!error){ 
     [[myClient post:@"/" params:[RKRequestSerialization serializationWithData:[json dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON] delegate:self] send]; 
    } 
} 
+0

Không rõ vấn đề là gì. Dữ liệu không được gửi? Không nhận được? Yêu cầu và tiêu đề phản hồi của bạn trông như thế nào? Cân nhắc sử dụng http://www.charlesproxy.com/ để được trợ giúp. Ngoài ra, đừng quên kiểm tra dấu kiểm màu xanh bên cạnh câu trả lời hay nhất cho các câu hỏi trước của bạn. Bạn sẽ nhận được nhiều phản hồi hơn theo cách đó. –

+0

Trong cách mã của tôi, tôi không gửi yêu cầu JSON.Tôi đã rõ ràng, máy chủ đang nhận dữ liệu như "? Jsonrpc = '2.0' & method = 'authenticate' ..." Tôi cần biết cách phân tích cú pháp đó thành JSON – clopez

+0

Bạn có thể kiểm tra yêu cầu do Restkit gửi bằng cách kích hoạt gỡ lỗi đăng nhập thông qua dòng này trong mã 'RKLogConfigureByName (" RestKit/Network ", RKLogLevelTrace);' – redDragonzz

Trả lời

9

tôi đã cùng một vấn đề, và đây là những gì giải quyết nó cho tôi. Lưu ý, trong kịch bản của tôi, tôi chỉ muốn truy cập RKRequest.

NSDictionarty *dict 
NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error]; 

if (!jsonData) 
{ 
    NSAssert(FALSE, @"Unable to serialize JSON from NSDict to NSData"); 
} 
else 
{ 
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
    request.params = [RKRequestSerialization serializationWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON]; 
} 

Chìa khóa cho tôi là 'MIMEType: RKMIMETypeJSON' ở dòng cuối cùng. Vì tôi chỉ muốn sử dụng RKRequest, đây là cách tôi cần thiết để thiết lập loại MIME. Nếu không, tôi sẽ sử dụng gợi ý của Paul Cezanne.

+0

Điều này cũng giống như tôi đã đưa vào bản cập nhật câu hỏi của mình, tôi nghĩ, nhưng không sao cả. P – clopez

24

Đối cũ RestKit

Bạn có thể có một cái gì đó như thế này trong đại biểu của bạn:

objectManager.serializationMIMEType = RKMIMETypeFormURLEncoded; 

Bạn muốn nó là:

objectManager.serializationMIMEType = RKMIMETypeJSON; 

Đối RestKit v.20:

// thanks ColdLogic (from his comment) 
    [objectManager setRequestSerializationMIMEType:RKMIMETypeJSON]; 
+0

Tôi không làm việc với Trình quản lý đối tượng, tôi cho rằng đề xuất của bạn hoạt động khi bạn ánh xạ một đối tượng. Đây không phải là trường hợp nhưng tôi nghĩ rằng tôi đã giải quyết được vấn đề của mình. Tôi sẽ đăng assap giải pháp. Cảm ơn Paul !. – clopez

+0

ah vâng, tôi thấy điều đó ngay bây giờ. Vui vì bạn đã giải quyết nó! –

+12

cho bộ lưu trữ v.20: '[objectManager setRequestSerializationMIMEType: RKMIMETypeJSON];' – ColdLogic

Các vấn đề liên quan