使用 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>
我有一份 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>