bounty将在5天后过期。回答此问题可获得+50声望奖励。ventsyv希望引起更多人关注此问题。
我不理解swagger中对象参数的默认值,文档中似乎没有任何示例。
例如:
components:
parameters:
coordinates:
in: query
name: coordinates
description: Test Obj Parameter
schema:
type: object
properties:
lat:
type: number
default: 0.0
long:
type: number
default: 0.0
required: false
paths:
/my/path/:
get:
parameters:
- $ref: "./common.yaml#/components/parameters/coordinates"
1.我假设我可以在路径的参数部分定义default: [51.47, 0.0]
?
1.如果所有成员字段都是可选的,并且参数本身也是可选的,我是否需要在路径的参数中指定一个默认值?如果我不这样做,并且用户在没有提供值的情况下调用端点,后端会得到坐标0,0吗?
使用default: [51.47, 0.0]
、default: {"lat":51.4, "lon":0.0}
生成的代码和未指定默认值的代码是相同的。
使其中一个成员字段为必填字段似乎只需要添加一个isSet标志、setteng和unsetter函数。
1条答案
按热度按时间yvfmudvl1#
这里有几个不同的问题,所以我将把它们分成三个主题
1.在哪里可以找到一个带有定义默认值的参数的有效模式的示例?
1.我可以在路径的参数部分定义默认值吗?
1.如果参数和成员字段是可选的,是否需要声明默认值?
spring
生成器的gradle-plugin。如果您无法使用我提供的代码,我可以更新此插件以使用不同的插件或生成器。*示例在哪里?
swagger documentation for parameters有一个名为默认参数值的部分。
“在参数架构中使用default关键字指定可选参数的默认值。默认值是客户端未在请求中提供参数值时服务器使用的值。值类型必须与参数的数据类型相同。”
它还具有以下示例:
您在问题中提供的坐标模式是一个有效的模式。我甚至在自己的生成器中使用
spring
生成器测试了它,并且我能够创建一个有效的对象。该对象定义了以下字段:如您所见,默认值已按预期定义。
路径的参数部分可以定义默认值吗?
坦率地说,没有。swagger documentation声明:
$ref的任何兄弟元素都会被忽略。这是因为$ref的工作方式是用它所指向的定义替换它自己和它所在级别上的所有元素。
考虑以下模式:
这个模式看起来是有效的,并且可以通过大多数验证工具。但是,如果我们查看swagger-ui中的employee info对象,我们会看到名称和地址的描述忽略了模式中的描述。x1c 0d1x
这是因为,正如文档所述,与
$ref
相同级别的任何其他内容都将被忽略。这同样适用于您尝试在路径级别设置的任何默认值。如果您引用的是包含在其他位置的架构,则默认值将被忽略。
需要声明默认值吗?
这更像是一种风格的选择,福尔斯了古老的答案:“it depends”.记住swagger-ui部分是REST接口,但也是你的文档。你用这些坐标做什么?如果用户不提供它们会发生什么?预期会发生什么?提供或不提供它们会改变你的API响应模式吗?
最重要的是,您是否希望用户知道坐标的默认值?
例如,你可以很容易地在你的控制器中添加一个方法,如果请求中没有提供这些值,它会将这些值设置为某个值。你不必告诉你的用户这一点。这将是一个没有文档的默认值。如果你想告诉你的用户这一点,你可以设置一个示例和一个描述来解释默认值。
如果这个值是必需的,我个人倾向于让用户提供它。这可以确保他们知道他们请求的是什么,他们得到的是什么。如果这个值是可选的,这一切都归结为样式和文档。我更喜欢向我的用户解释用法,所以我会记录默认值,这样他们就知道它是如何使用的。这也会导致字段被自动设置。例如上面的Java代码。
更新显示使用示例而不是默认值
下面是一个在参数中使用示例的yaml。您可以将其复制并粘贴到swagger editor中,以查看它是如何呈现和显示的。当选择要查看的示例时,请注意描述发生了变化。还请注意,当您单击尝试时,它将使用示例创建一个请求(使用您在示例中提供的值:
现在可以看到下拉列表中提供了每个示例沿着值的描述。
如果您在employee示例上单击try it out,它将创建以下请求:
https://my.server.com/employees?name=Bob%20Smith&title=Front%20Desk&responsibilities=working&responsibilities=playing&phone=%28123%29%20555-1234