0

给定以下类(注意:这些类不在讨论中,它们只是以这种方式存在)

class Foo {}

class Bar {}

class Event {

  Foo foo;
  Bar bar;
  String event;

  public Event(Foo foo, String event){
    ..
  }

  public Event(Bar bar, String event){
     ..
  }
}

事件与 Foo 或 Bar 相关联,但从不与两者相关。

你会像你的 REST api 那样建模吗(这对你的 api 的用户来说或多或少感觉很自然):

POST /foo/{FOO-ID}/event
GET /foo/{FOO-ID}/event  --> gets the list of events for FOO with the given id
GET /foo/{ID}/event/{EVENT-ID}

POST /bar/{BAR-ID}/event
GET /bar/{BAR-ID}/event --> gets the list of events for BAR with the given id
GET /bar/{BAR-ID}/event/{EVENT-ID}

还是您更喜欢(或多或少反映了域模型):

POST /event
GET /event?id=123&type=FOO --> gets the list events of for FOO with id = 123
GET /event?id=456&type=BAR --> gets the list of events for BAR with id = 456
GET /event/{EVENT-ID} 
GET /event --> not implemented, it would logically return ALL events(both FOO and BAR), but this has no business meaning

2 个 api 中的哪一个是“最”REST-ful?为什么?

4

1 回答 1

3

从您的模型来看,Event它本身就是一个实体和资源。

第一种方法发出不同的信息:从这个角度来看,Event是a orFoo的子资源,Bar这意味着它依赖于其中一个的存在,如果它的“父”不再存在,它也会存在。

现在我不认为你的模型有这样的关系。如果没有/ ,当然 aEvent可能没有意义,但它确实有单独的意义。明天,s 可能与其他新实体相关,因此依赖它们的人应该在开始跟踪它们时更改,而不是相反。FooBarEventEventEvent

最后,查询参数的使用对于算法资源或作为集合的“范围”过滤器很常见,这是您的第二种情况。

如果FooorBar作为类具有 type 的属性Event,则可以应用第一种方法。

两种方法都是“RESTFul”。粗略地说,REST 是关于以正确的方式使用 HTTP 方法,并使用唯一的 URI 来识别唯一的资源。问题是第二种方法更好地将您的模型(及其关系)描述为一组资源。

于 2013-10-08T15:48:37.120 回答