RESTAPI-设计考虑

RESTAPI-设计考虑,rest,Rest,我有一个关于设计RESTAPI的问题。考虑下面的情况:我们得到了名为横幅< /代码>的表,名为图像< /代码>。每个横幅都有一个图像,每个图像都属于一个横幅(表图像用于存储另一个图像,而不仅仅是横幅,因此连接表不是解决方案) 我已经阅读了一些关于创建REST API的文章,根据这些文章,我应该为数据检索创建以下URI: 1) api/banner/1 2) api/banner/1/image 但我总是需要一个带有横幅的图像,所以为什么不通过调用第一个API路由来返回所有内容呢?如果我采用这种

我有一个关于设计RESTAPI的问题。考虑下面的情况:我们得到了名为<代码>横幅< /代码>的表,名为<代码>图像< /代码>。每个横幅都有一个图像,每个图像都属于一个横幅(表图像用于存储另一个图像,而不仅仅是横幅,因此连接表不是解决方案)

我已经阅读了一些关于创建REST API的文章,根据这些文章,我应该为数据检索创建以下URI:

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方法,这意味着您应该考虑其他操作,如创建、更新和删除。这将有助于确定提供上述哪些操作-例如:

  • 你曾经创建过没有图像的横幅吗?
  • 如果你这样做,你应该提供这两种资源。但是您仍然可以嵌入图像资源(如果存在),以保存第二个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       |        |___________|________|
    |__________|___________|