RESTAPI-设计考虑
我有一个关于设计RESTAPI的问题。考虑下面的情况:我们得到了名为<代码>横幅< /代码>的表,名为<代码>图像< /代码>。每个横幅都有一个图像,每个图像都属于一个横幅(表图像用于存储另一个图像,而不仅仅是横幅,因此连接表不是解决方案) 我已经阅读了一些关于创建REST API的文章,根据这些文章,我应该为数据检索创建以下URI:RESTAPI-设计考虑,rest,Rest,我有一个关于设计RESTAPI的问题。考虑下面的情况:我们得到了名为横幅< /代码>的表,名为图像< /代码>。每个横幅都有一个图像,每个图像都属于一个横幅(表图像用于存储另一个图像,而不仅仅是横幅,因此连接表不是解决方案) 我已经阅读了一些关于创建REST API的文章,根据这些文章,我应该为数据检索创建以下URI: 1) api/banner/1 2) api/banner/1/image 但我总是需要一个带有横幅的图像,所以为什么不通过调用第一个API路由来返回所有内容呢?如果我采用这种
1) api/banner/1
2) api/banner/1/image
但我总是需要一个带有横幅的图像,所以为什么不通过调用第一个API路由来返回所有内容呢?如果我采用这种方式(两条路线),我应该如何实现来自前端的呼叫?我应该先编写两个
http.get()
方法来检索横幅,然后再检索其关联的图像吗?谢谢你的回答 在这种情况下,您有几种选择:
提供两种资源
正如您所指出的,如果您同时提供这两种资源,则必须执行两个GET请求来检索所需的所有数据
提供这两种资源,并将图像嵌入到横幅中
您可以执行这两项操作-api/banner/1/image
可以返回有关图像的数据,api/banner/1
可以返回有关嵌入图像的横幅的数据
如果您使用一种媒体类型,例如它将被视为“嵌入式”资源:
{
"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 | |___________|________|
|__________|___________|
否则,如果图像表中的两条记录具有相同的banner\u id,您将如何处理它?您的API URL结构不应代表真实的数据库结构。如果您切换到(例如)像mongodb这样的nosql数据库,数据库结构将看起来非常不同 此外,您的数据库结构也不是最优的。您的图像表不应该知道消费者(
banner\u id
,articel\u id
稍后comment\u id
?)
保持简单:
调用
api/banner/1
将返回在客户端显示横幅所需的所有数据 感谢这篇优秀的帖子:-)它帮助我消除了关于RESTAPI的困惑:)
table Banner table Images
________________________ ______________________
| id | Int | | id | Int |
| title | VARCHAR | | filename | VARCHAR|
| image_id | Int | |___________|________|
|__________|___________|