在REST API中公开关系(用户如何引用对象?)

时间:2014-12-26 07:30:55

标签: rest web api-design hateoas

在我的模特中,我有EventUser s。每个Event都有一个leader属性,指向User,但是并不总是必须有主机,在这种情况下,主机为空。

在我的API中:

GET /users/会返回所有用户的列表

GET /users/3/返回用户3信息,{"name": "John", "href": "/users/3/"}

GET /events/返回所有事件的列表

GET /events/2/host/应该返回作为事件2主机的用户。(比如说这是用户3)

我应该返回{"href": "/users/3/"},只是指向用户的链接吗?或者用户本身的表示,{"name": "John", "href": "/users/3/"}

让我说我选择第一个选项。如何更改用户?

PUT /events/2/host/ json={"href": "/users/2/"} - 这有意义吗?然后我的服务器必须解析端点以确定哪个用户ID是新主机,然后在数据库中分配它。看起来有点不合适,但Flask有办法将端点解析为参数。但这是正确的方法吗?

最后,在GET /events/2/资源中,我考虑在表示中使用属性"host":{"href": "/events/2/host/"}。这有意义吗?如果没有主机,则根本没有href属性,只有一个空字典分配给host

1 个答案:

答案 0 :(得分:0)

简而言之,我认为您应该在获取事件时返回表示,例如,在更新事件时使用链接。但设计仍然取决于你; - )

以下是不同的案例:

GET /events/2/host/
{"name": "John", "href": "/users/3/"}

PUT /events/2/host/
{"href": "/users/3/"}

DELETE /events/2/host/ (to set the host field to null)

我认为OData v4规范可以为您的设计提供一些好的想法。此链接提供了有关处理与OData的实体关系的方式的良好见解:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/entity-relations-in-odata-v4

此外,通过查询参数$expand,OData允许配置是否加载实体依赖项。如果例如定义了字段host,则您将获得引用实体的内容(如果不是),仅具有引用。

OData还提供了一种获取后缀为$ref的依赖项的引用的方法。

另一个链接也可以为您提供一些想法:http://templth.wordpress.com/2014/12/15/designing-a-web-api/

希望它对你有所帮助。 亨利