使用 openapi-generator 生成客户端时如何覆盖服务器 -> url (basepath)?

How do I override the servers -> url (basepath) when generating client using openapi-generator?

我有一份 OpenAPI 规范文档(我无法控制),其中包含以下片段:

servers:
  - url: http://www.[someservice].com/api

我正在使用此 OpenAPI 文档生成我在 Angular SPA 中使用的打字稿-angular 客户端。当我 运行 在生产环境中使用它时,这工作正常(我的 api 后端可以在 url 提供的访问)。

我想使用 http://localhost:1234/api 进行本地测试。如何使用 openapi-generator 覆盖基本路径,以便生成可在本地运行的客户端代码?

生成的angular客户端可以通过配置实例为服务器url配置。这是我们 app.module.ts 的摘录,让客户端通过客户端服务 url 调用服务器(您应该能够将 basePath 定义为您的值):

@NgModule({
  declarations: [...],
  imports: [
    ...
    ApiModule.forRoot(() => {
      return new Configuration({
        basePath: ``,
      });
    }),
    ...
  ],
  ...
  bootstrap: [AppComponent],
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}

直到他们将其放入文档中,如果您使用的是 openapi-generator Maven 插件,则该概念称为 server variables - 它已记录在案 here 并已通过,例如到 CLI 生成器,如下所示:

    --server-variables <server variables>
        sets server variables overrides for spec documents which support
        variable templating of servers.

例如(我以 corresponding feature pull request 为例):

openapi-generator generate -g java -i myproject/myapi.json -o myproject/generated --server-variables=host=myhost.com,basePath=myapi

以上可以容纳例如myapi.json(我们的 API 的规范)包含以下内容的场景:

...    
"servers": [
    {
      "url": "https://{host}/{basePath}/v1/",
      "variables": {
        "host": {
          "default": "service.domain.org"
        },
        "basePath": {
          "default": "mythings"
        }
      }
    }
  ],
...

在这种情况下,生成的 ApiClient.java 将包含以下内容:

private String basePath = "https://myhost.com/myapi/v1";

上面的我没有实际尝试过,组装起来作为例子。我在一个工作示例中尝试的是按以下方式使用 openapi-generator-maven-plugin(请参阅 serverVariableOverrides):

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>5.4.0</version>
    <executions>
       <execution>
          <goals>
             <goal>generate</goal>
          </goals>
          <configuration>
             <inputSpec>${project.basedir}/src/main/resources/myapi.json</inputSpec>
             <generatorName>java</generatorName>
             <library>resttemplate</library>
             <apiPackage>com.mycompany.myapi.client.generated.api</apiPackage>
             <modelPackage>com.mycompany.myapi.client.generated.model</modelPackage>
             <invokerPackage>com.mycompany.myapi.client.generated.invoker</invokerPackage>
             <configOptions>
                <dateLibrary>java8</dateLibrary> <!-- otherwise we have a problem, threetenbp has to be used -->
             </configOptions>
             <serverVariableOverrides>host=myhost.com,basePath=myapi</serverVariableOverrides>
          </configuration>
       </execution>
    </executions>
 </plugin>