避免将请求对象包装到 OpenAPI Generator 中从 OpenAPI 3.0 规范到 Typescript 的 InlineObject1 中

Can*_*ğlu 10 swagger typescript openapi openapi-generator

我正在尝试使用 OpenAPI Generator 4.0.0-SNAPSHOT(我们的经理出于某种原因要求我们使用该版本)生成 Typescript 客户端,该客户端读取 OpenAPI 3.0 规范。我们当前的所有端点要么接受查询字符串中的数据,要么接受表单正文中的数据,并且它们都工作得很好。我有一个新端点,它将在 POST 正文中读取 JSON 数据(其他端点最终也会被转换)。它将接受如下所示的对象:

{email: "something@domain.com"}

我正在尝试在 YAML 中记录端点,如下所示:

 /users/send-password-reminder:
    post:
      [...]
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
      responses:
        [...]
Run Code Online (Sandbox Code Playgroud)

但是,当我生成 Typescript 客户端时,它会生成一个SendPasswordReminderRequest对象,该对象包装一个自动生成的InlineObject1对象,该对象包装我实际的email.

这导致我像这样使用它:

const req: SendPasswordReminderRequest = {
    inlineObject1:{
      email: "..."
  }
};

APIClient.user.sendPasswordReminder(req, ...)
Run Code Online (Sandbox Code Playgroud)

InlineObject1我想要的是完全摆脱它并SendPasswordReminderRequest直接包装email属性,并能够将其用作:

const req: SendPasswordReminderRequest = {
   email: "..."
};

APIClient.user.sendPasswordReminder(req, ...)
Run Code Online (Sandbox Code Playgroud)

components/requestBodies我尝试在和 using中定义主体$ref,它仍然包装实际主体,即使它使用我的请求主体类型的名称。

我怎样才能摆脱这个包装?

小智 12

我不确定这是否仍然与您相关,但在代码中我找到了一种方法来解决根本不生成 InlineObjects 的问题

如果您为 requestBody 中使用的模式定义“title”,它将使用它title来命名内联对象。

因此,您可以获取类似于以下内容的内容,而不是获取 InlineObject:sendPasswordReminderRequestData,具体取决于您命名架构的方式。

希望这对您或其他人有帮助:)。

  • 你能分享这种行为的例子吗?谢谢❤️ (2认同)

jos*_*ley 5

以下是如何将标题添加到 POST 请求的示例,以便通过客户端生成器使用友好名称生成标题(为简洁起见,省略了其他数据):

{
  "openapi": "3.0.1",
  "paths": {
    "/Users/Hello": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "title": "UsersHelloRequest",
              }
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)