具有多个 ID 的 Rest API 资源命名

Wal*_*TTI 8 javascript rest express

看完之后 :

\n\n

https://restfulapi.net/resource-naming/

\n\n

当文档具有多个唯一 ID 时,我有一个关于重新分级集合中的引用文档的问题。

\n\n

在链接的材料中给出了一个示例:

\n\n
\n

我们可以使用 URI\n \xe2\x80\x9c/customers/{customerId}\xe2\x80\x9d 来标识单个 \xe2\x80\x9ccustomer\xe2\x80\x9d 资源。

\n
\n\n

或者

\n\n
http://api.example.com/device-management/managed-devices/{device-id}\nhttp://api.example.com/user-management/users/{id}\nhttp://api.example.com/user-management/users/admin\n
Run Code Online (Sandbox Code Playgroud)\n\n

还有我的例子:

\n\n
http://myserver/api/courses/{id}\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中有一个 js Express 函数对应:

\n\n
app.get(\'/api/courses/:id\', (req, res) =>... \n
Run Code Online (Sandbox Code Playgroud)\n\n

我的问题是,如果我的文档(课程)有两个我想使用的唯一 ID 密钥,我该如何维护一致的 API。

\n\n

例如ID1和ID2。

\n\n

我该如何用 Express 进行编码以及如何编写 url?

\n\n

因此,如果我需要两个 API:

\n\n
http://myserver/api/courses/{id1}\nhttp://myserver/api/courses/{id2}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我提供两个 Express 例程:

\n\n
app.get(\'/api/courses/:id1\', (req, res) =>... \napp.get(\'/api/courses/:id2\', (req, res) =>... \n
Run Code Online (Sandbox Code Playgroud)\n\n

ID1 和 ID2 都是相同的类型(例如数字)。REST API 如何区分这两者?

\n

Voi*_*son 5

REST 不关心资源标识符的拼写。约定(如https://restfulapi.net/resource-naming/所描述的约定)大致类似于有关拼写变量名称的编码约定。

从 REST 客户端的角度来看,/api/courses/X/api/courses/Y是不同的资源——这些资源可能共享相同的底层表示(因为它们是根据相同的底层数据构造的),但这是服务器的实现问题。

URI 拼写仅受RFC 3986限制。

/api/courses?id1=12345
/api/courses?id2=67890
Run Code Online (Sandbox Code Playgroud)

这是一个完全合理的选择。一个潜在的好处是 HTML 包含一个用于创建带有查询参数的 URI 模板的标准。一个潜在的缺点是相对引用解析以不同于路径段中的分层数据的方式处理查询部分中的非分层数据。

/api/courses/id1/12345
/api/courses/id2/67890
Run Code Online (Sandbox Code Playgroud)

完全合理的选择,与上面相反的权衡。

/api/courses/id1=12345
/api/courses/id2=67890
Run Code Online (Sandbox Code Playgroud)

这实际上与上面的想法相同,只是拼写略有不同。它具有简单和人类可读的优点。然而,实际使用该模式可能具有挑战性,具体取决于您拥有哪种路由支持。

作为URI 模板,这些可能看起来像

/api/courses/id1={id}
/api/courses/id2={id}
Run Code Online (Sandbox Code Playgroud)

但在有 4 级 URI 模板支持的地方,您也许可以使用

 /api/courses/{/ids*}
Run Code Online (Sandbox Code Playgroud)

另一种可能性是使用“矩阵参数”启发的拼写,例如

/api/courses;id1=12345
/api/courses;id2=67890
Run Code Online (Sandbox Code Playgroud)

同样,这为您提供了一组不同的可读性、模板支持、相对分辨率支持等权衡。

另请参阅 Stefan Tilkov -休息:我不认为这意味着您认为的那样


cha*_*tfl 1

您需要在路径中或作为查询参数对 url 进行另一个区分,以便了解正在发送哪个字段。默认值用于字段 #1,另一个用于字段 #2

app.get('/api/courses/:id1', (req, res) =>... 
app.get('/api/courses/other-key/:id2', (req, res) =>...
Run Code Online (Sandbox Code Playgroud)