我正在团队中开发一个新项目,我们正在遵循 API 优先方法来实现 API。我们使用openapi-generator-maven-pluginOpenAPI 3.0.3 格式的 yml 文件生成 API。为了生成 swagger 文件,我们使用 springfox 2.9.2。我面临的问题是当我尝试为请求增加安全性时。
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
security:
- bearerAuth: [ ]
Run Code Online (Sandbox Code Playgroud)
该Authorize按钮不会出现在 swagger 页面中,仅出现请求附近的锁,但它不会执行任何操作(见下图)。
我观察到,如果我打开/v2/api-docsswagger json 不包含安全定义部分。
我设法添加安全性的唯一方法是通过 Docket 对象中的代码添加安全部分,如下所示:
new Docket(DocumentationType.SWAGGER_2)
.securityContexts(Collections.singletonList(securityContext()))
.securitySchemes(Collections.singletonList(bearerJwtKey()))
.select()
.apis(RequestHandlerSelectors.basePackage("com.example"))
.paths(PathSelectors.any())
.build();
Run Code Online (Sandbox Code Playgroud)
这是为 Swagger UI 添加安全性的唯一方法还是我遗漏了什么?
我们使用 OpenAPI 3.0.0 架构构建 API,并生成用于应用程序前端部分的打字稿代码。我们定义了一个端点,它应该能够使用多个文件并将它们上传到后端。这是端点的 requestbody 的样子:
requestBody:
content:
multipart/form-data:
schema:
properties:
images:
type: array
items:
type: string
format: binary
required:
- images
Run Code Online (Sandbox Code Playgroud)
在有关文件上传的 OpenAPI 网页以及 Stackoverflow 上的多个帖子中也找到了类似的定义。
生成 API 时,images预计类型为Array<Blob>。当文件输入元素的输入在前端发生更改时,将调用端点。更具体地说,端点的调用方式如下:
const onInputChange = useCallback(() => {
const files = inputRef.current.files; // React.useRef that's passed in as ref for the html input-element
uploadImages(Array.from(files)); // uploadImages is the function that calls the endpoint
}, [inputRef, api]);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,API 验证始终返回状态代码为 400 - 错误请求的 HTTP 响应。查看 OpenAPI 生成器生成的实现,-propertyimages …
multifile-uploader swagger typescript openapi openapi-generator
我正在尝试生成具有继承的 Java 模型(Open API 2.0)。问题与此类似:如何让maven swagger codegen插件使用继承生成Java类?
我想实现没有鉴别器属性的继承。为什么这个字段必须在父类中指向?此外根据文档:
鉴别器固定字段必须引用同一架构中的属性,并且它必须是必需的属性
我不想指出任何必填字段。我只是想获得遗产。还有其他方法可以做到这一点吗?我知道一些“解决方法”是改变属性级别:
"Child": {
"allOf": [
{"$ref": "#/components/schemas/Parent"},
],
"properties": {.......}
}
Run Code Online (Sandbox Code Playgroud)
但这相当不符合规范。最令人惊讶的部分是它适用于 openapi-generator-maven-plugin,但此时如果我们放入“必需”列表,则不会生成正确的代码。必填字段列表将被省略,但继承将正确生成。
有没有其他方法可以在没有歧视器的情况下生成正确的继承?
我正在使用带有 Spring Boot 的 OpenAPI+OpenAPI-generator,并尝试使用oneof如下架构:
这是 requests.yaml 文件中的配置:
...
requestBody:
name: request
required: true
content:
application/json:
schema:
oneOf:
- $ref: 'components.yaml#/Request'
- $ref: 'components.yaml#/ComplexRequest'
...
Run Code Online (Sandbox Code Playgroud)
这是 Components.yaml 文件中的相关配置:
Request:
allOf:
- $ref: '#/BaseInfo'
- type: object
properties:
should_create:
type: boolean
enum: [ false ]
reference_id:
type: string
required:
- reference_id
ComplexRequest:
allOf:
- $ref: '#/BaseInfo'
- type: object
properties:
should_create:
type: boolean
enum: [ true ]
create_data:
$ref: '#/Reference'
required:
- create_data
BaseInfo:
type: object
properties:
customer_id:
type: …Run Code Online (Sandbox Code Playgroud) 我是 OpenApi 新手,想使用 api.yaml (OpenApi 版本 3.0.1)定义我的 api。我的问题是生成的枚举仅包含名称而不包含值。
这是我的代码中的枚举:
TEST1(1, "Test 1", "T1"),
TEST2(2, "Test 2", "T2"),
TEST3(3, "Test 3", "T2");
Run Code Online (Sandbox Code Playgroud)
这是使用 OpenApi 生成后的枚举:
TEST1("TEST1"),
TEST2("TEST2"),
TEST3("TEST3");
Run Code Online (Sandbox Code Playgroud)
枚举自动定义如下:
testenum:
type: string
description: desciption of the enum
enum:
- TEST1
- TEST2
- TEST3
Run Code Online (Sandbox Code Playgroud)
如何在 api.yaml 中定义枚举以使其看起来像第一个示例?
java enums openapi openapi-generator openapi-generator-maven-plugin
我将 OpenAPI 3 规范中的参数描述为
review_requests:
get:
tags:
- dashboard
operationId: reviewRequests
parameters:
- name: page
in: query
default: 0
description: Page number
schema:
type: integer
responses:
200:
description: OK
Run Code Online (Sandbox Code Playgroud)
编译后,我发现 Java 代码中缺少默认值,并且参数实际上描述如下:
@Valid @RequestParam(value = "page", required = false) Integer page
Run Code Online (Sandbox Code Playgroud)
如果 GET 请求中未提供参数,则0我不会收到。null据我了解应该是
@Valid @RequestParam(value = "page", required = false, defaultValue = "0") Integer page
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是我做错了什么?
我使用 OpenApi 3.0 和 maven 插件openapi-generator-maven-plugin来生成我的 api + 对象。
这是我的 Maven 配置:
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.basedir}/src/main/resources/BookingService.yaml</inputSpec>
<generatorName>spring</generatorName>
<modelPackage>${clientPackage}.model</modelPackage>
<invokerPackage>${clientPackage}.invoker</invokerPackage>
<apiPackage>${clientPackage}.api</apiPackage>
<generateApis>true</generateApis>
<generateApiTests>false</generateApiTests>
<generateModelTests>false</generateModelTests>
<configOptions>
<delegatePattern>true</delegatePattern>
</configOptions>
</configuration>
</execution>
Run Code Online (Sandbox Code Playgroud)
它按预期工作,但它也会生成我不想要的测试。正如您在我的配置中看到的,我禁用了 Api 测试 + 模型测试的测试。
这些测试的编译失败,因为构建目标文件夹中的“无法解析符号‘SpringBootTest’”...
这些测试没有任何意义,我该如何禁用它们?
我有一个包含以下代码段的 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 覆盖基本路径,以便我可以生成在本地工作的客户端代码?
升级到 Angular 11 后,我无法再访问ng serve我的 Web 应用程序。
我正在使用 Spring Doc 和最新的 OpenAPI 生成器 gradle-plutin (5.0.0) 生成客户端。
该问题似乎与我的(生成的)REST 客户端有关。打开 https://localhost:4200 会将以下内容写入控制台:
main.ts:12 Error: inject() must be called from an injection context
at injectInjectorOnly (core.js:4901) [angular]
at Module.??inject (core.js:4911) [angular]
at Object.ApiModule_Factory [as factory] (meditation-rest-client.js:2885) [angular]
at R3Injector.hydrate (core.js:11158) [angular]
at R3Injector.get (core.js:10979) [angular]
at :4200/vendor.js:82591:55 [angular]
at Set.forEach (<anonymous>) [angular]
at R3Injector._resolveInjectorDefTypes (core.js:11016) [angular]
at new NgModuleRef$1 (core.js:25046) [angular]
at NgModuleFactory$1.create (core.js:25100) [angular]
at :4200/vendor.js:100468:45 [angular]
at Object.onInvoke (core.js:28301) …Run Code Online (Sandbox Code Playgroud) 现在我的 Api 返回一个模型,其中包含一个Dictionary<int, string>属性:
public Dictionary<int, string> Subdivisions { get; set; }
Run Code Online (Sandbox Code Playgroud)
当我运行 OpenApi Generator 时,输出类有
public Dictionary<string, string> Subdivisions { get; set; }
Run Code Online (Sandbox Code Playgroud)
我知道 JSON 规范不允许整数键,但这确实搞砸了那些期待 <int, string> 的 API 消费者。
我能做些什么来确保我的输出类有Dictionary<int, string>而不是Dictionary<string, string>?
openapi ×8
swagger ×5
java ×2
spring-boot ×2
angular ×1
c# ×1
enums ×1
maven ×1
openapi-generator-maven-plugin ×1
polymorphism ×1
springdoc ×1
typescript ×1