如果架构有其他引用,我如何在 OpenAPI 3 中为 GET 和 POST 请求引用相同的架构

少言寡语

我有以下 OpenAPI 3 架构:

{
  ...,
  "components": {
    "schemas": {
      "User": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64",
            "readOnly": true
          },
          "name": {
            "type": "string"
          }
        }
      },
      "Report": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64",
            "readOnly": true
          },
          "user": {
            "$ref": "#/components/schemas/User"
          }
        }
      }
    }
  }
}

现在,如果我为 User 和 Report 指定 GET 请求,一切看起来都不错。用户的 POST 请求也有效。但是,对 Report 的 POST 请求不起作用。Report POST 请求的正文应如下所示:

{
  "user": {
    "id": 1
  }
}

因此不应指定“name”属性,因为它只是对已存在的用户的引用,并将根据 id 进行匹配。

是否可以编写 Report POST 请求,以便它理解只应指定用户的 id?还是我被迫创建两种不同的报告模式,一种用于 GET 请求,一种用于 POST 请求?

软件2

有几种方法可以解决这个问题。您可以专门为 POST 创建一个定义,也可以将您的User定义拆分为更多原子组件以供重用。

选项 1:多个定义

将您的报告user定义构建为如下所示:

"user": {
  "id": {
    "type": "integer",
    "format": "int64",
    "readOnly": true
  }
}

这样做的好处是快速简便,不会影响您定义的其他领域。但这会导致大量代码重复,并且未来对设计的任何更改都要求您确保不会遗漏任何这些特殊定义。

选项 2:拆分和重用您的定义

您有两个不同的属性,它们具有不同的用途,在多个定义中使用。这是一个很好的参考人选。将您的User定义拆分为多个模式。像这样的东西:

"schemas": {
  "userId": {
    "type": "integer",
    "format": "int64",
    "readOnly": true
  },
  "userName": {
    "type": "string"
  },
  "User": {
    "type": "object",
    "properties": {
      "id": {
        "$ref": "#/components/schemas/userId"
      },
      "name": {
        "$ref": "#/components/schemas/userName"
      }
    }
}

这使您可以重用userIdReport有着怎样的相同的定义id实际上是。当您开始将定义扩展为更大的 API 时,这种方法可能开始变得难以阅读,但随着您的 API 形状随着时间的推移而变化,这种方法更易于维护。请注意,这也有助于定义用户 ID 和报告 ID 之间的区别,虽然它们共享相同的名称,但可能拥有不同的数据,并且随着时间的推移可能会有不同的规则。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以在OpenAPI 3中引用单个路径和方法?

在OpenAPI中,如何使引用架构的某些字段必填?

如何在OpenAPI 3中引用数组项目示例?

如何在 FastAPI 中为 UploadFile 创建 OpenAPI 架构?

如何在 Spring Boot 中使用 OpenAPI 3 从“响应”和“请求正文”中隐藏“模式”?

如何从 OpenAPI 3.0 中的数组架构引用另一个架构?

如何在VBA中为Get和Post请求传递API密钥?

如何在@DatabaseTable中引用其他架构

我可以在Laravel的控制器中为get和post方法使用相同的名称吗

如何在Swift中执行GET和POST请求?

如何在Swift中创建GET,POST和PUT请求?

如何在 OpenAPI 中引用响应组件?

OpenApi 3从外部文件导入架构

如何在与函数相同的架构中引用表?

在OpenAPI 3.0中引用self

如何在PHP中读取GET和POST请求(post在json中)

如何在OpenAPI 3.0中的架构内使用$ ref?

在 Express 中处理 POST 和 GET 请求

如何在OpenAPI(Swagger)中描述此POST JSON请求主体?

OpenAPI 3-readOnly属性,但允许在POST / PUT中写入

openapi:引用列表中的现有示例

NodeJS和Express:如何打印在GET和POST请求中传递的所有参数

如何在 Django 中为视图编写 get 和 post 测试方法?

如何在POST请求中向其他Feign客户端发出GET请求?

使用angularJS中的相同控制器功能执行GET和POST请求

如何在OpenAPI / Swagger中递归地引用类型定义?

如何在android中的GET和POST请求中添加HttpCookies?

如何在OpenAPI 2.0中为同一操作定义path和formData参数?

如何在Symfony2或Symfony3中检查请求是POST还是GET请求