我有一个关于设计 REST API 的问题。考虑以下情况:我们有一个名为 banners
的表和名为 images
的表.每个横幅都有一个图像,每个图像属于一个横幅(表格图像用于存储另一幅图像,不仅仅是横幅,因此加入表格不是解决方案)。
table Banner table Images
________________________ ______________________
| id | Int | | id | Int |
| title | VARCHAR | | filename | VARCHAR|
|__________|___________| | banner_id | Int |
| article_id| Int |
|___________|________|
我已经阅读了一些关于创建 REST API 的文章,根据它们,我应该制作这个用于数据检索的 URI:
1) api/banner/1
2) api/banner/1/image
但是我总是需要带有横幅的图像,那么为什么不通过调用第一个 API 路由来返回所有内容更好呢?如果我这样做(两条路线),我应该如何实现来自前端的调用?我应该写两个
http.get()
首先检索横幅然后检索其关联图像的方法?感谢您的回答!
最佳答案
在这种情况下,您有几种选择:
提供两种资源
正如您所指出的,如果您提供这两种资源,则必须执行两次 GET 请求才能检索所需的所有数据。
提供两种资源,并在横幅中嵌入图像
两者都可以 - api/banner/1/image
可以返回关于图像的数据,以及api/banner/1
可以返回有关横幅的数据,其中嵌入了图像。
如果您使用媒体类型,例如 HAL它将被视为“嵌入式”资源:
{
"id": 1,
"title": "banner title",
"_embedded": {
"image" : {
"id": 1,
"filename": "some path",
"_links": {
"self": {
"href": "api/banner/1/image"
}
}
}
},
"_links": {
"self": {
"href": "/api/banner/1"
}
}
}
通过这种方式,您可以通过一个
GET
获得所需的所有数据。 .只提供横幅资源
没有规则说您的数据库表必须与您的 API 资源完全对齐。
只提供没有错
api/banner/1
并让它返回如下内容:{
"id": 1,
"title": "banner title",
"imageFileName": "some path"
}
您碰巧在系统内部将数据字段存储在单独的表中的事实只是一个实现细节/
不要忘记非 GET 方法
尽管您目前专注于 GET 方法,但您的资源结构还应该考虑您想要提供的非 GET 方法,这意味着您应该考虑其他操作,例如创建、更新和删除。这将有助于确定提供上述哪些操作 - 例如
关于你的数据结构的建议
您提到该图像可能用于其他类型的图像,但横幅只能有一个图像。如果是这种情况,我建议改变关系的方向,例如:
table Banner table Images
________________________ ______________________
| id | Int | | id | Int |
| title | VARCHAR | | filename | VARCHAR|
| image_id | Int | |___________|________|
|__________|___________|
否则,如果Image 表中的两条记录具有相同的banner_id,您将如何处理?
关于REST API - 设计考虑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439285/