具有两个独立主键的实体的RESTful API行为

Rob*_*ert 5 rest restful-url restful-architecture

我有以下实体:

<car>
    <carID>7</carID>
    <...>...</...>
    <externalCarID>23890212</externalCarID>
</car>
Run Code Online (Sandbox Code Playgroud)

现在的问题是,carIDexternalCarID是用于通过/不同系统都独立主键,它应该是可能的API客户端访问一个car与两个实体carIDXOR的externalCarID

这两个键都是整数,并且使用不交集:

carID(7) != externalCarID(7)
Run Code Online (Sandbox Code Playgroud)


我想到了以下解决方案:

  1. 使用/restapi/car/7和访问/restapi/externalcar/23890212
  2. 使用参数,例如like /restapi/car/7?type=regular/restapi/car/23890212?type=ext
  3. 将信息发送到标头中的某处 - 但是在哪里?

一些技巧来解决这个问题或对我的解决方案提供反馈,最好参考REST / HTTP规范,这将是很棒的!

有关主键的背景:

假设我们的发票系统需要carID和母公司控制系统需要externalCarID。我一点都不喜欢它,但是它是一个正在运行的系统,我现在没有办法对其进行更改。

Dan*_*ott 6

我建议您选择一个 ID 作为“真正的主要”,并按照建议访问它:

/restapi/car/7
Run Code Online (Sandbox Code Playgroud)

如果您控制其中一个 ID,那么我建议将其用作“真正的主要”。

另一个 ID,即使它是唯一标识符,也应该使用查询参数访问:

/restapi/car?extid=23384
Run Code Online (Sandbox Code Playgroud)

有一些类似的问题可能会有所帮助:

REST API 设计 - 通过 REST 获取具有不同参数但具有相同 url 模式的资源

相同资源的不同 RESTful 表示

最后要考虑的一件事是将“extid”的 url 重定向到该资源的规范 URL。

  • 问题是查询参数通常被视为过滤器。因此 /restapi/car/7 将返回一个带有 200/404 响应的单个项目,具体取决于密钥是否存在。但是,/restapi/car?extid=23384 将始终返回带有集合的 200 响应。在这种情况下,由于查询参数是唯一键,因此集合将包含单个项目,如果不存在匹配记录则为空。 (2认同)

Rob*_*rtT 1

在提出的三个选项中,第一个对我来说看起来最好。特别是考虑到每个外部系统仅使用一个基本 URL。对于第二个选项,你也可以使用/restapi/car/?extid=23384看起来更干净的。在第三种情况下,在我看来,标头更适合元数据,因此使用它们不是为了管理表示上下文,而是为了完全更改 url 返回的对象,这不是一个干净的选择。就我个人而言,根据您的性能要求,我会选择第一个解决方案或常规解决方案,/rastapi/car/7因为id我会考虑系统中的主要解决方案和restapi/car/?extid=1234辅助唯一密钥,可能将 GET 重定向到规范网址(如果它不会影响性能)很多。