有没有办法阻止 Autorest.Powershell 扁平化响应对象?

Is there a way to stop Autorest.Powershell from flattening response objects?

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

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

我的Autorest.Powershell客户returns像这样的扁平对象:

{
  "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"
        }
      }
    }
  }
}

有几种方法,none 其中非常简单(因为,我开始相信,大多数与 AutoRest 相关的事情都是如此;抱歉,无法抗拒 :-P ) .

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

  • @autorest/core (3.0.6369)
  • @autorest/modelerfour (4.15.414)
  • @autorest/powershell (3.0.421)

最后,这里是 AutoRest 代码库的相关部分:inline properties plug-in and configuration directive definition

inlining-threshold 设置

此设置控制内部对象可以具有的最大属性数,以便将其视为符合内联条件。您可以在命令行或“文学配置”.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 插件还定义了一个自定义指令,用于指定永远不应内联某些架构。使用“文学配置”,就像

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

这种方法的优点是no-inline指令覆盖了上面提到的“always inline properties in a 属性 named properties”异常,所以它可以用来缓解问题。

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

低级变换

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

```yaml
directive:
- from: code-model-v4-no-tags
  where: $.schemas.objects.*
  transform: |
    $.language.default['skip-inline'] = true;
```