【问题标题】:How to use Restkit to POST JSON and map response如何使用 Restkit 发布 JSON 并映射响应
【发布时间】:2012-09-17 08:15:00
【问题描述】:

我是第一次使用 RestKit,它的功能集看起来很棒。我现在已经多次阅读该文档,我正在努力寻找一种将 JSON 参数发布到提要并映射 JSON 响应的方法。通过在 stackoverflow 上搜索,我找到了一种通过 GET 发送 JSON 参数的方法,但我的服务器只需要 POST。

这是我目前的代码:

RKObjectMapping *issueMapping = [RKObjectMapping mappingForClass:[CDIssue class]];
[objectMapping mapKeyPath:@"issue_id" toAttribute:@"issueId"];
[objectMapping mapKeyPath:@"title" toAttribute:@"issueTitle"];
[objectMapping mapKeyPath:@"description" toAttribute:@"issueDescription"];
RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"http://restkit.org"];
RKManagedObjectStore* objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"News.sqlite"];
objectManager.objectStore = objectStore;

NSDictionary params = [NSDictionary dictionaryWithObjectsAndKeys: @"myUsername", @"username", @"myPassword", @"password", nil];
NSURL *someURL = [objectManager.client URLForResourcePath:@"/feed/getIssues.json" queryParams:params];

[manager loadObjectsAtResourcePath:[someURL absoluteString] objectMapping:objectMapping delegate:self]

从另一个 stackoverflow 线程 (http://stackoverflow.com/questions/9102262/do-a-simple-json-post-using-restkit),我知道如何使用以下代码执行简单的 POST 请求:

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

我希望有人能帮我将这两个代码 sn-ps 结合成一个可行的解决方案。

【问题讨论】:

标签: objective-c ios restkit


【解决方案1】:

要发布一个对象,我所做的是将 path 关联到一个 object。然后使用 RKObjectManager 中的方法 postObject

我假设您已经配置了 RestKit,因此您已经设置了基本路径并为您的 CDIssue 定义了对象映射,就像您在已有的代码中所做的那样。考虑到这一点,试试这个代码:

//We tell RestKit to asociate a path with our CDIssue class
RKObjectRouter *router = [[RKObjectRouter alloc] init];
[router routeClass:[CDIssue class] toResourcePath:@"/path/to/my/cdissue/" forMethod:RKRequestMethodPOST];
[RKObjectManager sharedManager].router = router;

//We get the mapping for the object that you want, in this case CDIssue assuming you already set that in another place
RKObjectMapping *mapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:[CDIssue class]];

//Post the object using the ObjectMapping with blocks
[[RKObjectManager sharedManager] postObject:myEntity usingBlock:^(RKObjectLoader *loader) {

    loader.objectMapping = mapping;
    loader.delegate = self;

    loader.onDidLoadObject = ^(id object) {
        NSLog(@"Got the object mapped");
        //Be Happy and do some stuff here
    };

    loader.onDidFailWithError = ^(NSError * error){
        NSLog(@"Error on request");
    };

    loader.onDidFailLoadWithError = ^(NSError * error){
        NSLog(@"Error on load");
    };

    loader.onDidLoadResponse = ^(RKResponse *response) {
        NSLog(@"Response did arrive");
        if([response statusCode]>299){
            //This is useful when you get an error. You can check what did the server returned
            id parsedResponse = [KFHelper JSONObjectWithData:[response body]];
            NSLog(@"%@",parsedResponse);
        }

    };


}];

【讨论】:

  • 感谢您的回复。我在 2 月份发布了最初的问题,在没有得到回复后我放弃了 RestKit。我现在真的不记得如何使用它了,所以我无法测试这个答案。该代码看起来与我记忆中的 restkit 文档不同,所以我想知道他们是否对库进行了一些更改/更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多