REST API - 设计考虑

标签 rest

我有一个关于设计 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 方法,这意味着您应该考虑其他操作,例如创建、更新和删除。这将有助于确定提供上述哪些操作 - 例如
  • 您是否曾经创建过没有图像的横幅?
  • 如果你这样做,你应该提供这两种资源。但是您仍然可以嵌入图像资源(如果存在),以保存第二个 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/

    相关文章:

    ios - 带有错误映射的 RestKit PUT 请求

    rest - 如何通过postman调用Azure Search相关的REST API?

    laravel - 如何使用 Laravel Sanctum 限制 SPA Web 应用程序的设备登录

    java - 如何在从移动客户端调用的 Spring REST Web 服务中创建和销毁 session

    rest - 如何在不实际执行的情况下模拟 HTTP DELETE 操作的后果

    spring - Oauth2从 token 获取用户名

    java - 当 Spring 中的一列属于复合主键时,如何按该列进行过滤

    java - 使用 Springservlet 实现 Weblogic Rest 服务

    java - 如何使用 java 休息来使用 Angular 渲染 nv3d 烛台图?

    c# - 尝试 GET 时出现 WCF REST 404