【问题标题】:Restkit - Post objectRestkit - 发布对象
【发布时间】:2013-09-11 13:55:32
【问题描述】:

我尝试使用 方法发布一个对象 Foobar(该类有两个属性:string foostring bar) RKObjectManager 类的 postObject

服务器端,我有一个接收 POST 方法的 WCF 服务

public void PostFoobar(Foobar foobar) { ... }

所有连接都有效。问题是接收到的对象 foobar 始终为 NULL。似乎 ResKit 没有将我的对象作为两个参数的封装发布,而是独立发布两个字符串。

我的意思是,当我尝试实现以下方法(服务器端)时:

public void PostFoobar(string foo, string bar) { ... }

而且这两个参数都不为空!它奏效了! 但我显然更愿意恢复序列化的对象......

我的问题是:

我应该如何配置我的 POST 请求以在服务器端恢复整个 Foobar 对象,而不是独立地恢复每个属性?

我的代码

这是我发送 POST 请求的代码

NSError *error = nil;
NSManagedObjectModel *managedObjectModel = @"myObjecModel";
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];

[managedObjectStore createPersistentStoreCoordinator];

NSPersistentStore __unused *persistentStore = [managedObjectStore addInMemoryPersistentStore:&error];
NSAssert(persistentStore, @"Failed to add persistent store: %@", error);

[managedObjectStore createManagedObjectContexts];
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];

[RKManagedObjectStore setDefaultStore:managedObjectStore];

// Configure the object manager
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://192.168.1.10/rest"]];
objectManager.managedObjectStore = managedObjectStore;
objectManager.requestSerializationMIMEType = RKMIMETypeJSON;
[objectManager setAcceptHeaderWithMIMEType:RKMIMETypeJSON];
[RKObjectManager setSharedManager:objectManager];
[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"text/plain"];

RKEntityMapping *postMapping = [RKEntityMapping mappingForEntityForName:@"Foobar" inManagedObjectStore:managedObjectStore];
[postMapping addAttributeMappingsFromDictionary:@{
 @"foo" : @"strFoo",  // server side:foo, iOS side: strFoo
 @"bar" : @"strBar"   // server side:bar, iOS side: strBar
 }];
RKRequestDescriptor * requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[postMapping inverseMapping] objectClass:[Foobar class] rootKeyPath:nil method:RKRequestMethodPOST];
[objectManager addRequestDescriptor:requestDescriptor];

// POST to create
RKManagedObjectStore *objectStore = [[RKObjectManager sharedManager] managedObjectStore];
Foobar *foobar = [NSEntityDescription insertNewObjectForEntityForName:@"Foobar" inManagedObjectContext:objectStore.mainQueueManagedObjectContext];
foobar.strFoo = @"foo ipad";
foobar.strBar = @"bar ipad";

@try {
    [[RKObjectManager sharedManager] postObject:foobar path:@"foobar" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        NSLog(@"Success");
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"Failure: %@", error.localizedDescription);
    }];
}
@catch (NSException *exception) {
    NSLog(@"error - %@", exception);
}

还有一件事:

我已经使用 chrome 客户端“Simle REST 客户端”测试了我的 Web 服务,它可以处理数据:

{ "foo": "foo from chrome", "bar" : "bar from chrome" }

编辑 - 使用 Wireshark 进行帧捕获

好像不错..我不明白。

【问题讨论】:

    标签: ios http-post restkit restkit-0.20


    【解决方案1】:

    你打电话给nil:

    [[RKObjectManager sharedManager] postObject:nil path:@"foobar" parameters:nil ...
    

    所以 RestKit 没有任何序列化和参数。

    如果这是一个拼写错误,请为映射打开跟踪日志并查看它在做什么。此外,获取 Charles 或类似工具,并准确检查通过网络发送的数据。

    【讨论】:

    • 抱歉打错了。在我的编辑中,您可以看到通过网络发送的内容。够你吃吗?
    • 传出的数据看起来不错,与您的 chrome 测试相匹配。我不知道 WCF,但是您如何指示它将传入的对象(字典)转换为 Foobar 实例?
    • 我没有,它是自动完成的。我将使用另一个 REST 客户端进行测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2011-12-05
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多