4

我在使用 2 个实体的应用程序中使用 RestKit 0.20.0rc1:

  1. 一个“笔记”(NoteClass)。
  2. 一个“集合”(SetClass),其中包含一组音符。

我有以下 2 个响应描述符(其中包括):

// GET /sets/:setID/notes
// Get a set's notes. Response looks like this:
//   {"notes": [ (array of NoteClass dictionaries) ],
//               ...more stuff...
//   }
RKResponseDescriptor *noteResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[NoteClass rkEntityMapping]
                                                             pathPattern:@"/sets/:setID/notes"
                                                                 keyPath:@"notes"
                                                             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:noteResponseDescriptor];

// GET /sets/:setID
// Get information about a set. Response looks like this:
//   {"name": "My Set",
//    "numNotes": 3,
//    ...more stuff...
//   }
RKResponseDescriptor *setResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[SetClass rkEntityMapping]
                                                             pathPattern:@"/sets/:setID"
                                                                 keyPath:nil
                                                             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:setResponseDescriptor];

当我请求“/sets/:setID/notes”时,noteResponseDescriptor 匹配(预期)。但是,setResponseDescriptor 也匹配(意外)。我相信这是因为响应描述符的路径模式与子字符串“/sets/:setID”匹配,并且因为键路径为零。结果,当我发出请求时,我得到的 RKMappingResult 包含一个 NoteClass 对象数组(预期)和一个空的 SetClass 对象(意外)。

如何防止 setResponseDescriptor 匹配此注释端点?我还不能向 setResponseDescriptor 添加关键路径,所以我更喜欢这样的解决方案,它允许我说“match /sets/:setID$”之类的内容,其中“$”表示 URL 的结尾。

4

1 回答 1

1

事实证明,现在有一种方法可以防止您的示例出现多次匹配(请参阅此处的讨论)。

虽然正在寻找解决方案,但您有几个选项可以解决此问题:

  1. 更改您的 API 网址,以免导致歧义
  2. 检查映射结果对象的类型并丢弃任何意外对象
  3. 按照讨论线程中的建议修改 [RKResponseDescriptor matchesPath:]。

但是,每种解决方案都以自己的方式存在缺陷。

于 2013-03-08T12:36:43.217 回答