swagger - Undvik att kapsla in request-objektet i InlineObject1 i OpenAPI Generator från OpenAPI 3.0-specifikation till Typescript


Jag försöker generera en Typescript-klient med OpenAPI Generator 4.0.0-SNAPSHOT (vår chef bad oss använda den versionen av någon anledning) som läser en OpenAPI 3.0-specifikation. Alla våra nuvarande slutpunkter tar antingen emot data i frågesträngen eller som formulärkropp, och de fungerar alla perfekt. Jag har en ny slutpunkt som kommer att läsa data som JSON i POST-kroppen (andra slutpunkter kommer så småningom också att konverteras). Den kommer att acceptera ett objekt som följande:

{email: "[email "}

Jag försöker dokumentera slutpunkten i YAML som följande:

 /users/send-password-reminder:
    post:
      [...]
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
      responses:
        [...]

Men när jag genererar Typescript-klienten genererar den ett SendPasswordReminderRequest-objekt, som kapslar in ett autogenererat InlineObject1-objekt, som kapslar in mitt faktiska email.

Detta får mig att använda det som:

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

APIClient.user.sendPasswordReminder(req, ...)

Vad jag istället vill är att helt bli av med InlineObject1 och göra så att SendPasswordReminderRequest direkt omsluter email-egenskapen, och kunna använda det som:

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

APIClient.user.sendPasswordReminder(req, ...)

Jag har försökt definiera kroppen i components/requestBodies och använda $ref, och det omsluter fortfarande den faktiska kroppen även om det använder namnet på min request body-typ.

Hur kan jag bli av med detta omslag?

Svar #1

Jag är inte säker på om detta fortfarande kommer att vara relevant för dig, men i koden hittar jag ett sätt att lösa det så att InlineObjects inte genereras alls

Om du definierar "title" för ditt schema som används i requestBody, kommer det att använda denna title för att namnge inline-objektet.

Så istället för att få InlineObject kan du få något liknande: sendPasswordReminderRequestData, beroende på hur du namnger ditt schema.

Hoppas detta hjälper dig eller någon annan :).

Svar #2

Här är ett exempel på hur man lägger till titeln i en POST-begäran så att den genereras med ett vänligt namn via klientgeneratorer (andra uppgifter utelämnas för korthet):

{
  "openapi": "3.0.1",
  "paths": {
    "/Users/Hello": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "title": "UsersHelloRequest",
              }
            }
          }
        }
      }
    }
  }
}

Relaterade artiklar