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

Mar*_*ark 5 openapi-generator

我有一个包含以下代码段的 OpenAPI 规范文档(我无法控制):

servers:
  - url: http://www.[someservice].com/api
Run Code Online (Sandbox Code Playgroud)

我正在使用这个 OpenAPI 文档来生成我在我的 Angular SPA 中使用的 typescript-angular 客户端。当我在生产中运行它时,这很好用(我的 api 后端可以通过提供的 url 访问)。

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

小智 9

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

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


hel*_*rth 5

直到他们将其放入文档中,如果您使用 openapi-generator Maven 插件,则该概念被称为server variables- 它记录在此处并传递给 CLI 生成器,如下所示:

    --server-variables <server variables>
        sets server variables overrides for spec documents which support
        variable templating of servers.
Run Code Online (Sandbox Code Playgroud)

例如(我从相应的功能拉取请求中获取了示例):

openapi-generator generate -g java -i myproject/myapi.json -o myproject/generated --server-variables=host=myhost.com,basePath=myapi
Run Code Online (Sandbox Code Playgroud)

上面的内容可以适应 myapi.json(我们 API 的规范)包含以下内容的情况:

...    
"servers": [
    {
      "url": "https://{host}/{basePath}/v1/",
      "variables": {
        "host": {
          "default": "service.domain.org"
        },
        "basePath": {
          "default": "mythings"
        }
      }
    }
  ],
...
Run Code Online (Sandbox Code Playgroud)

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

private String basePath = "https://myhost.com/myapi/v1";
Run Code Online (Sandbox Code Playgroud)

我实际上还没有尝试过上面的内容并将其作为示例进行组装。我在工作示例中尝试的是按以下方式使用 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>
Run Code Online (Sandbox Code Playgroud)