swagger OpenAPI:混合了强制字段、可选字段和未指定字段

vd2z7a6w  于 2023-04-06  发布在  其他
关注(0)|答案(2)|浏览(129)

我需要指定我的端点有一个必填字段,一个可选字段,并对任何数量的字段开放(可以在没有验证的情况下发送)。
例如,对于端点/user

user_id: str, mandatory
timestamp_utc: timestamp, optional
..*accept_any_extra_fields**..

所以如果有人向我的端点发送下面的JSON,端点应该接受它

{ "user_id": 1,
  "name": "Sam",
  "location": "USA"
}

但是如果发送以下JSON,则失败,因为它不包含user_id

{ "name": "Sam",
  "location": "USA"
}

它应该失败。
我是OpenAPI/Swagger的新手。我知道我可以发送额外的数据。但是我如何将其描述为OpenAPI上的文档,以便一个人(或程序)知道他们可以发送任何字段(例如,名称,位置)沿着user_id

4c8rllxm

4c8rllxm1#

additionalProperties关键字允许模式具有除properties部分中列出的属性之外的其他属性。

MyModel:
  type: object
  required:
    - user_id
  properties:
    user_id:
      type: string
    timestamp_utc:
      type: string
  additionalProperties: true   # OpenAPI 3.x
  # or
  # additionalProperties: {}   # OpenAPI 2.0

实际上OpenAPI模式是open to extension by default,缺少additionalProperties关键字。然而,一些工具认为缺少additionalProperties是“不允许的附加属性”,因此最好显式添加additionalProperties: true/additionalProperties: {}以防万一。
如果额外的属性限于特定的数据类型,例如string,则使用

additionalProperties:
   type: string
mrzz3bfm

mrzz3bfm2#

你使用Java-Spring吗?我在我的Spring控制器中使用Swagger in Annotation方法,在java代码中,你可以通过这种方式指定你需要的参数:

@ApiOperation(value = "Get user", notes = "Get a user by the given filters")
@GetMapping("v1/users")
public UserDTO getUsers(@ApiParam(value = "User id", required = true)
                        @RequestParam(value = "user_id", required = true) String userId,

                        @ApiParam(value = "Date", required = false)
                        @RequestParam(value = "timestamp_utc", required = false) 
                        @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime utc,

                        @ApiParam(value = "Some other", required = false)
                        @RequestParam(value = "some_other", required = false) String someOther){

             return service.getUser(userId, utc, someOther);
      }

注解@ApiOperation用于描述您的endpint。
注解@ApiParam用于描述参数的特性,所需的属性用于通知。
不要忘记添加swagger依赖项,here在maven上。
您还可以使用YAML生成API文档。例如here。请检查用户/登录的端点。
我希望我的回答能对你有所帮助。

相关问题