0

我的 swagger.json 文件中有一个响应对象,其中包含一个嵌套对象作为其字段之一。当我使用Autorest.Powershell为这个 API 生成客户端时,它会扁平化嵌套对象。因此,当服务返回以下响应时:

{
  "code": 200,
  "status": "OK",
  "data": {
    "FileName": "gameserver.zip",
    "AssetUploadUrl": "https://example.com"
  }
}

我的 Autorest.Powershell 客户端返回一个扁平对象,如下所示:

{
  "code": 200,
  "status": "OK",
  "dataFileName": "gameserver.zip",
  "dataAssetUploadUrl": "https://example.com"
}

我可以使用某种配置设置来禁用此行为吗?

如果有帮助,这是我的 swagger.json 文件的相关部分:

"definitions": {
  "GetAssetUploadUrlResponse": {
    "type": "object",
    "properties": {
      "AssetUploadUrl": {
        "description": "The asset's upload URL.",
        "type": "string"
      },
      "FileName": {
        "description": "The asset's file name to get the upload URL for.",
        "type": "string"
      }
    },
    "example": {
      "FileName": "gameserver.zip",
      "AssetUploadUrl": "https://example.com"
    }
  }
},
"responses": {
  "GetAssetUploadUrlResponse": {
    "description": "",
    "schema": {
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "description": "The Http status code. If X-ReportErrorAsSuccess header is set to true, this will report the actual http error code."
        },
        "status": {
          "type": "string",
          "description": "The Http status code as a string."
        },
        "data": {
          "$ref": "#/definitions/GetAssetUploadUrlResponse"
        }
      },
      "example": {
        "code": 200,
        "status": "OK",
        "data": {
          "FileName": "gameserver.zip",
          "AssetUploadUrl": "https://example.com"
        }
      }
    }
  }
}
4

1 回答 1

1

有几种方法,没有一种是真正简单的(因为,我开始相信,大多数与 AutoRest 相关的事情都是如此;抱歉,无法抗拒 :-P )。

有三种半官方方式。这里的半官方意味着它们基于公共 AutoRest 机制,但它们本身没有记录。作为半官方的,它们可能只适用于某些版本的 AutoRest 组件,所以,这里是我使用的那些(来自autorest --info):

  • @autorest/核心 (3.0.6369)
  • @autorest/modelerfour (4.15.414)
  • @autorest/powershell (3.0.421)

最后,这里是 AutoRest 代码库的相关部分:内联属性插件配置指令定义

inlining-threshold环境

此设置控制内部对象可以具有的最大属性数,以使其被视为符合内联条件。您可以在命令行或“literate config”.md 文件中设置它。

```yaml
inlining-threshold: 0
```

理论上,将其设置为0应该防止任何内部成员的属性被内联,但是插件有一个硬编码的异常,如果内部对象位于本身命名的属性中,properties那么限制将被忽略并且它仍然是扁平的。

definitions:
  SomeSchema:
    type: "object"
    properties:
      detail_info: # <-- threshold honored
        $ref: "#/definitions/InfoSchema"
      properties: # <-- this is always flattened because of its special name
        $ref: "#/definitions/OtherSchema"

no-inline指示

PowerShell AutoRest 插件还定义了一个自定义指令,用于指定永远不应内联某些架构。使用“literate config”,它就像

```yaml
directive:
- no-inline:
  - OtherSchema
  - ThirdSchema
```

这种方法的优点是该no-inline指令覆盖了上面提到的“总是在一个名为的属性中内联属性properties”异常,因此它可以用来缓解问题。

缺点是所有模式名称都应该明确列出。(似乎该指令也应该支持 Rx 名称表达式,但我无法开始no-inline: ".*"工作)

低级变换

这种方法在所有情况下都无条件地禁用内联,但是它与 AutoRest 使用的特定内部代码模型耦合。(原则上,模型应该是稳定的,至少在主要版本中)。它还依赖 PowerShell 插件使用特定(非合同)属性来标记从内联中排除的架构。

```yaml
directive:
- from: code-model-v4-no-tags
  where: $.schemas.objects.*
  transform: |
    $.language.default['skip-inline'] = true;
```
于 2021-02-12T23:06:50.320 回答