RestKit 一对多关系逆映射

Posted

技术标签:

【中文标题】RestKit 一对多关系逆映射【英文标题】:RestKit one to many relationship inverse mapping 【发布时间】:2015-09-08 11:51:04 【问题描述】:

我正在使用 RestKit 将 JSON API 映射到 ios 对象

+ (RKObjectMapping *)addressMapping

    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Address class]];

    [mapping addAttributeMappingsFromDictionary:@
                                                  @"id": @"idAddress",
                                                  @"id_city": @"idCity",
                                                  @"id_country": @"idCountry"
                                                  ];

    return mapping;


+ (RKObjectMapping *)userMapping

    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[User class]];

    [mapping addAttributeMappingsFromDictionary:@
                                                  @"id": @"idUser",
                                                  @"email": @"email",
                                                  ];

    [mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"address" toKeyPath:@"address" withMapping:[self addressMapping]]];
    [mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"branch_addresses" toKeyPath:@"branchAddresses" withMapping:[self addressMapping]]];

    return mapping;

当我从 API 获取数据时,它们已正确映射到类:

RKResponseDescriptor *responseDescriptorGet =
    [RKResponseDescriptor responseDescriptorWithMapping:[RestMappingProvider userMapping]
                                                 method:RKRequestMethodGET
                                            pathPattern:@"/api/user/user"
                                                keyPath:@"data"
                                            statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

但是,当我更新数据时,一对多关系(branch_addresses)未正确映射:

RKRequestDescriptor *requestDescriptor =
    [RKRequestDescriptor requestDescriptorWithMapping:[[RestMappingProvider userMapping] inverseMapping]
                                          objectClass:[User class]
                                          rootKeyPath:nil
                                               method:RKRequestMethodPUT];

服务器收到的数据:

[id] => 123
[email] => test@test.com
[address] => Array
    (
        [id] => 3
        [id_city] => 1
        [id_country] => 1
    )
[branch_addresses] => Array
    (
        [0] => Array
            (
                [id] => 4
            )

        [1] => Array
            (
                [id_city] => 1
            )

        [2] => Array
            (
                [id_country] => 1
            )
    )

服务器上的数据应该是什么样子:

[id] => 123
[email] => test@test.com
[address] => Array
    (
        [id] => 3
        [id_city] => 1
        [id_country] => 1
    )
[branch_addresses] => Array
    (
        [0] => Array
            (
            [id] => 4
            [id_city] => 1
            [id_country] => 1
            )
    )

服务器端 php://input 的内容(原始数据):

id=123&email=test%40test.com&address[id]=3&address[id_city]=1&address[id_country]=1&branch_addresses[][id]=4&branch_addresses[][id_city]=1&branch_addresses[][id_country]=2&branch_addresses[][id]=6&branch_addresses[][id_city]=1&branch_addresses[][id_country]=1

【问题讨论】:

解析的 JSON?你需要解释什么是错的。 你好韦恩。我已经用预期的输出(JSON 格式)更新了这个问题。 address 与 branch_address 是同一个对象。 branch_addresses 是它们的数组。为什么TestKit在1-1关系时返回格式正确但1-many关系格式不正确? @Wain 我真的不确定当一个方向(API -> iOS)正确映射数据而另一个方向(iOS -> API)不是时会出现什么问题。您需要任何其他信息吗? 实际的 JSON。通常 MIME 类型是错误的,您可能会发送其他内容。 @Wain 我在服务器端添加了 php://input 的原始内容。我刚刚意识到它实际上不是 JSON,但它并没有改变我的问题/问题。 【参考方案1】:

并非所有形式的数据传输都具有同等的表现力。似乎您发送的是查询参数而不是 JSON,或者至少是一组表单编码的数据。您需要设置默认请求 mime 类型,以便 restkit 知道您要发送 JSON 并将其转换为所需的格式。

【讨论】:

你太棒了。当我将 requestSerializationMIMEType 更改为 RKMIMETypeJSON 时,一切正常。谢谢!

以上是关于RestKit 一对多关系逆映射的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 0.2 映射 Core Data <--> JSON 与一对多关系

如何保持对象一对多 RestKit

RestKit Core Data 一对多映射

RestKit 一对多逆向关系(无CoreData)

RESTKit:具有一对多关系的 POST

如何使用 RestKit 指定关系?