RESTful API设计:"拥有"的ID值资源

时间:2015-12-25 19:47:19

标签: api rest

在设计restful API时,在设计URI时需要考虑资源所有权。就我而言,我正在开发一个API,我的两个实体将是人和地址。每个人都可以拥有多个地址,因此在数据库中他们将位于不同的表中。

通常我只使用自动递增键,因此每次添加新记录都会增加ID号。

我的想法是,如果我使用这种方法,它会有效地产生这样的URI:

/people/11/addresses/52

在这种情况下,person 11 没有 52 addresses。它只是 11 的人,其地址的ID为 52

另一方面是我是否会使用这样的URI。地址通常不会被客户端自己检索,但作为单个API调用检索的人物对象的一部分(/people/11将检索与该人相关联的所有地址)。

无论如何,我想这里的问题是关于最佳实践。看到另一个拥有ID值的实体是否常见?这有什么一般做法?

3 个答案:

答案 0 :(得分:3)

当您以个性化方式为人员实体返回地址的详细信息时,通常会使用以下资源:/ people / 11 / addresses / 52。

例如,如果您有实体:可以拥有地址的人员和办公室,以及您想要仅显示国家/地区的人员以及要显示地址的所有详细信息的人员。

另一方面,如果您不需要自定义,您还可以使用类似:/ address / 12的URL,因为这样可以更容易地缓存响应。

  

地址通常不会被客户自行检索,   但作为单个API调用检索的person对象的一部分   (/ people / 11将检索与该人相关的所有地址)。

如果是这种情况,您可以省略详细地址网址。

答案 1 :(得分:3)

你的方法是正确的。 这些也是一般规则(reference):

- An API is a user interface for a developer - so put some effort into making it pleasant
- Use RESTful URLs and actions
- Use SSL everywhere, no exceptions
- An API is only as good as its documentation - so have great documentation
- Version via the URL, not via headers
- Use query parameters for advanced filtering, sorting & searching
- Provide a way to limit which fields are returned from the API
- Return something useful from POST, PATCH & PUT requests
- HATEOAS isn't practical just yet
- Use JSON where possible, XML only if you have to
- You should use camelCase with JSON, but snake_case is 20% easier to read
- Pretty print by default & ensure gzip is supported
- Don't use response envelopes by default
- Consider using JSON for POST, PUT and PATCH request bodies
- Paginate using Link headers
- Provide a way to autoload related resource representations
- Provide a way to override the HTTP method
- Provide useful response headers for rate limiting
- Use token based authentication, transported over OAuth2 where delegation is needed
- Include response headers that facilitate caching
- Define a consumable error payload
- Effectively use HTTP Status codes

网上还有很多参考文献。 This页面是一个好的开始。 这些也很有用:slide1devzone tutorial

答案 2 :(得分:0)

是的,这是在API中应用多对多关系的正确方法。记得在返回值时检查id2是否属于id1。

要检索所有地址,正确的呼叫为/people/11/addresses。然后你知道你必须调用连接查询。