【问题标题】:How to make a DTO out of a Swagger generated Golang model如何使用 Swagger 生成的 Golang 模型制作 DTO
【发布时间】:2020-02-28 09:45:10
【问题描述】:

我在 Go 中实现 REST API 时遇到了一些问题。

我使用 go-swagger 来记录我的 API。它基于结构生成模型。

我的第一个问题是我不知道在我的 swagger yaml 文件中如何定义一个简单的 hasMany 关系。

如果我需要一辆有很多轮子的车辆。在我的数据库中,我将有一个vehicle 表和一个包含车辆idwheel 表。

由于 Vehicle 没有wheel_id,因此我大摇大摆地得到一个简单的type: object。 对于轮子,我有一个属性:

  vehicle:
    $ref: '#/definitions/Vehicle'

这会生成一个模型:

type Wheel struct {
  ...
  Vehicle *Vehicle
}

当我请求轮子列表时,这不是我希望 API 返回的内容。

所以我需要一个 DTO 或某种映射器来在客户端和数据库之间工作。

阅读https://www.reddit.com/r/golang/comments/6xgzmp/model_to_dto_mapper_my_first_experience_with_go/ 看起来这不是在 Go 中做事的方式。

我是否需要删除我的 swagger 文件中的所有 ref 以使其更好地匹配模型? (将 $ref 替换为属性 id:类型:字符串)

我是否需要使用此处所述的反射:Spread operator analogue

在这种情况下,最佳做法是什么?

【问题讨论】:

  • 不清楚您希望您的网络通话在这里完成什么。如果您从/vehicle/{id} 获取,如果不是车辆,您期望得到什么?如果Vehicle 没有它的轮子的概念,那么当你到达vehicle 端点时,为什么还要一个轮子列表呢?
  • 我要的很标准。我想自定义我的回复。如果 /GET wheel/{id} 我不想要整个车辆对象(包含许多其他参考)
  • 嗯,那么是的,您必须创建一个自定义响应对象,因为包含对 Vehicle 定义的引用就是您向 Swagger 声明它应该在其返回中包含该模型。

标签: rest go swagger


【解决方案1】:

我找到的解决方案是在swagger中制作自定义响应模型:

/vehicle/{id}:
  get:
    ...
    responses:
      '200':
        schema:
          $ref: '#definitions/VehicleCustomeResponse'

我想我可以使用swagger的anyOf来减少重复的数量。

【讨论】:

  • Go-swagger 不(也永远不会)支持 openAPI 3,所以 anyOf 没有帮助。模型必须复制:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 2020-04-05
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
相关资源
最近更新 更多