【问题标题】:Cannot map single object无法映射单个对象
【发布时间】:2016-01-07 21:13:32
【问题描述】:

我在使用 RestKit 时遇到问题。

我有一个端点items/,我可以在其中GET 一组项目。这是一个示例返回:

[
  { item_id: 1 },
  { item_id: 2 },
  { item_id: 3 }
]

我还可以执行items/<item_id> 之类的操作来只获得一件物品。例如,如果我 GET items/2 我会得到这个:

{ item_id: 2 }

我是这样映射的:

let itemsResponseMapping: RKObjectMapping = RKObjectMapping(withClass: MyItem.self)
itemsResponseMapping.addAttributeMappingsFromDictionary(["item_id" : "itemId"])

let responseDescriptor = RKResponseDescriptor(
        mapping: itemsResponseMapping,
        method: RKRequestMethod.GET,
        pathPattern: "items",
        keyPath: nil,
        statusCodes: RKStatusCodeIndexSetForClass(RKStatusCodeClass.Successful)
)
objectManager.addResponseDescriptor(responseDescriptor);

所以,要请求我会这样做:

RKObjectManager.sharedManager().getObjectsAtPath(
        ENDPOINT,
        parameters: nil,
        success: {(operation: RKObjectRequestOperation!, mapping: RKMappingResult!) -> Void in
            //whatever
        },
        failure: {(operation: RKObjectRequestOperation!, error: NSError!) -> Void in
            //whatever
        }

当 ENDPOINT 为“items”时,它会成功。但是当 ENDPOINT 是“items/2”时,我会得到一个No response descriptors match the response loaded。如果我检查operation.HTTPRequestOperation.responseString,那么我看到获取成功,但问题是它没有映射它。

我在这里错过了什么??

编辑:我应该补充一点,我不拥有后端,并且应该在 iOS 中完成修复。

【问题讨论】:

    标签: ios swift rest restkit


    【解决方案1】:

    您需要添加路径模式为items/:id 的第二个响应描述符,因为简单路径模式不匹配。

    【讨论】:

    • 感谢您的回复!我刚试过这个,但没有用。但是,我怀疑您在这里走的是正确的道路。还有什么我可能会丢失的吗?我在文档中没有找到任何关于 ":id" 的信息。
    • 它在 SOCKit 文档中,也可能在 RestKit wiki 页面上。我认为我的路径语法正确
    • 好的,您的解决方案是正确的。由于我的不相关的疏忽,在您修复后它仍然失败。谢谢!
    【解决方案2】:

    问题在于不同的端点响应:items/ 返回一个对象数组,而items/<item_id> 返回单个对象,没有数组。观察 items/ 中不存在于 items/<item_id> 中的括号 []

    您试图将 items/<item_id> 的结果解析为对象数组,这导致了错误。

    解决此问题的一种简单方法是强制包含单个项目的结果以将其解析为数组。尝试转换

    { item_id: 2 }
    

    进入

    [ { item_id: 2} ]
    

    您的解析应该适用于这两种情况。

    【讨论】:

    • 感谢您的回复。你是绝对正确的。但是,我正在寻找 iOS 端的解决方案,因为我不拥有后端。
    • 我明白了。我不熟悉RKObjectManager,但似乎您需要以某种方式检查您注册的映射策略。有没有办法做这样的检查?如果不是,也许将其强制转换为数组?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2017-06-01
    • 2017-01-17
    相关资源
    最近更新 更多