阅读后:
https://restfulapi.net/resource-naming/
当文档具有多个唯一ID时,我有一个问题要求重新评级集合中的文档。
在链接的材料中给出了一个示例:
我们可以使用URI识别单个“客户”资源 “ / customers / {customerId}”。
或
http://api.example.com/device-management/managed-devices/{device-id}
http://api.example.com/user-management/users/{id}
http://api.example.com/user-management/users/admin
我的例子:
http://myserver/api/courses/{id}
其中有一个js Express函数副本:
app.get('/api/courses/:id', (req, res) =>...
我的问题是,如果我的文档(课程)具有两个我想使用的唯一ID密钥,我该如何保持一致的API。
例如ID1和ID2。
我该如何用快递方式编写代码以及如何编写url?
所以如果我需要两个API:
http://myserver/api/courses/{id1}
http://myserver/api/courses/{id2}
如果我提供两个Express例程:
app.get('/api/courses/:id1', (req, res) =>...
app.get('/api/courses/:id2', (req, res) =>...
ID1和ID2都是相同的类型(例如数字)。 REST API如何区分这两个?
答案 0 :(得分:3)
REST不在乎资源标识符的拼写。类似于https://restfulapi.net/resource-naming/描述的约定,大致类似于关于拼写变量名称的编码约定。
从REST客户端的角度来看,/api/courses/X
和/api/courses/Y
是不同的资源-这些资源可能共享相同的基础表示(因为它们是从相同的基础数据),但这是服务器的实现问题。
URI拼写仅受RFC 3986约束。
/api/courses?id1=12345
/api/courses?id2=67890
这是一个完全合理的选择。一个潜在的好处是HTML包含一种用于创建带有查询参数的URI模板的标准。潜在的缺点是相对引用分辨率对查询部分中的非分层数据与路径段中的分层数据的处理方式不同。
/api/courses/id1/12345
/api/courses/id2/67890
完全合理的选择,与上面的选择相反。
/api/courses/id1=12345
/api/courses/id2=67890
这实际上与上面的想法相同,但拼写略有不同。它具有易于操作和易于阅读的优点。但是,实际使用该模式可能会遇到挑战,具体取决于您拥有哪种路由支持。
就像URI templates一样,它们看起来像
/api/courses/id1={id}
/api/courses/id2={id}
但是在您具有4级URI模板支持的地方,您也许可以使用
/api/courses/{/ids*}
另一种可能性是使用“矩阵参数”启发式拼写,例如
/api/courses;id1=12345
/api/courses;id2=67890
同样,这为您提供了一组不同的权衡取舍,例如可读性,模板支持,相对分辨率支持等等。
另请参阅Stefan Tilkov-REST: I Don't Think It Means What You Think It Does。
答案 1 :(得分:0)
您需要在路径中或作为查询参数的URL中进行另一个区分,以便知道要发送哪个字段。默认值将用于字段#1,另一个用于字段#2
app.get('/api/courses/:id1', (req, res) =>...
app.get('/api/courses/other-key/:id2', (req, res) =>...
答案 2 :(得分:0)
REST API的命名约定与express确定它的方式不同。 OP将其路线写为快递的方式将无法区分这些路线。 Express将路由存储在堆栈中,并将与首先声明的路由(id1)匹配。 id1只是代表通用数据的名称(如范围变量)。