swagger 如何使用OpenAPI 3.1和Nelmio渲染散列表?

5hcedyr0  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(80)

我想正确地呈现一个hashmapkey:一个UUID,* 值 *:在我的API文档的Response schemaResponse samplesexamples)部分都有一个对象),例如:

{
  "objects": {
    "3a34655e-9566-4d5e-bce7-8fa71670993b": {
      "title": "Foo"
    },
    "4bb806a9-fcd1-4a32-b2f0-6cbb45cfc894": {
      "title": "Bar"
    }
  }  
}

我正在使用这些库进行Symfony 6项目,这些库应该与OpenAPI 3.03.1规范兼容:

  • zircote/swagger-php(版本:4.7.10
  • nelmio/api-doc-bundle(版本:v4.11.1

阅读this related StackOverflow answer,我考虑了两个选择:

选项1 -附加属性

/**
 * @var array<string, ObjectDto>
 *
 * @OA\Property(
 *     type="object",
 *     @OA\AdditionalProperties(
 *         type="object",
 *         ref=@Model(type=ObjectDto::class),
 *     ),
 *     description="The objects indexed by ID"
 * )
 */

问题

我没有找到任何方法来覆盖Response schema部分中呈现的默认分配给hashmap键的property name*,也没有找到Response samples部分中呈现的"property1""property2"

"objects": {
    "property1": { ... },
    "property2": { ... }
},

我可以自定义密钥的信息

选项2 -模式属性

/**
     * @var array<string, ObjectDto>
     *
     * @OA\Property(
     *     type="object",
     *     patternProperties={
     *         "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"=@OA\Property(
     *             type="object",
     *             ref=@Model(type=ObjectDto::class),
     *         )
     *     },
     *     description="The objects indexed by ID"
     * )
     */

问题

Response schema部分是可以的,但是在Response samples部分中生成的示例是,我得到:

"objects": { }

问题

我错过了什么吗?使用OpenAPI Specification 3.1是否可以完全控制散列表的呈现?

sg3maiej

sg3maiej1#

**OpenAPI 3.0似乎不支持使用,甚至不支持模仿patternProperties的效果。**你会在他们的一些提案中看到它,但截至2023年9月,它还没有实现。您需要将Map的对象转换为描述键值对的数组,可以是对象数组,也可以是元组。或者你可以站在我的立场上,无法从后端更改数据的表示,只能默默地为类型安全的丧失而哭泣。

Original Value:
    { myHashMap: { uniqueKey1: ..., uniqueKey2: ... }}

----Converted to objArray: ----------------------
{ myHashMap: [
    {id: uniqueKey1, value: ...},
    {id: uniqueKey2, value: ...}
  ]
} 

----Converted to tuple: ----------------------
{ myHashMap: [
    [uniqueKey1, ...(value)],
    [uniqueKey2, ...(value)]
  ]
}

我花了很长时间才弄明白,答案在this page上。OpenAPI使用jsonSchema的修改版本来描述对象,它支持额外的键,并放弃对其他键的支持,包括我们的belov'd patternProperties。

不支持的[jsonSchema]关键字:

  • 其他项目
  • const
  • 包含
  • 依赖关系
  • ID,
  • $id
    *patternProperties<-
  • propertyNames

他们提供了following page,它提供了关于处理字典、散列Map等的信息--尽管我找不到关于特定键处理模式的信息。

相关问题