我们有一个openapi文件(已验证),用于声明响应头,例如。
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"$ref": "#/definitions/CourseV2"
}
},
"paging": {
"$ref": "#/definitions/PagingInfo"
}
},
"required": [
"results"
]
},
"headers": {
"X-RateLimit-Limit": {
"type": "integer",
"description": "Request limit per hour."
},
"X-RateLimit-Remaining": {
"type": "integer",
"description": "The number of requests left for the time window."
},
"X-RateLimit-Reset": {
"type": "string",
"format": "date-time",
"description": "The UTC date/time at which the current rate limit window resets."
}
}
},
使用openapi生成器项目(maven或cli)生成的java webclient客户端,调用的返回类型不包括响应头,ApiClient类中的invokeAPI方法也不允许访问响应头。实际上,ApiClient invoke方法返回的是返回类型的Mono/Flux,因此不允许获取响应头
public <T> Mono<T> invokeAPI(String path, HttpMethod method, Map<String, Object> pathParams, MultiValueMap<String, String> queryParams, Object body, HttpHeaders headerParams, MultiValueMap<String, String> cookieParams, MultiValueMap<String, Object> formParams, List<MediaType> accept, MediaType contentType, String[] authNames, ParameterizedTypeReference<T> returnType) throws RestClientException {
final WebClient.RequestBodySpec requestBuilder = prepareRequest(path, method, pathParams, queryParams, body, headerParams, cookieParams, formParams, accept, contentType, authNames);
return requestBuilder.retrieve().bodyToMono(returnType);
}
据我所知,使用Spring Webclient访问响应头的唯一方法是使用toEntity,它提供了一个ResponseEntity方法(以及.getHeaders),而不是BodyToNo。
我错过了什么吗?
基于Spring的openapi生成器模板并没有提到响应头,但是这些头是由生成器核心引擎支持的,一些生成器的模板包含了对它们的 /some/支持。
此外,Swagger注释用于例如Java-Spring模板,允许指定给定响应的响应头。
到目前为止还不错。可以尝试增强选定生成器的模板。如果Java /Spring生成器,它将https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator/src/main/resources/JavaSpring/api.mustache
然而,当前的openapi生成器数据模型似乎有点不正确。
首先,响应头绑定到一个方法,而不是该方法的特定响应。这意味着一个人不能为不同的响应使用不同的头(例如,一个用于200
,另一个用于412
),这似乎是一个严重的缺陷。
其次,为了使生成器产生头(特别是枚举)所必需的类型,这些头不应该使用内置模式,所有模式都要放在#/组件/模式/
中,然后从相应的头引用:
components:
headers:
Repeatability-Result:
description: |
a header to implement server-side machinery for idempotency of requests
complying to OASIS Repeatable Requests Version 1.0
https://docs.oasis-open.org/odata/repeatable-requests/v1.0/repeatable-requests-v1.0.html
schema:
$ref: '#/components/schemas/RepeatabilityResult'
required: true
...
schemas:
RepeatabilityResult:
description: |
a header to implement server-side machinery for idempotency of requests
complying to OASIS Repeatable Requests Version 1.0
https://docs.oasis-open.org/odata/repeatable-requests/v1.0/repeatable-requests-v1.0.html
type: string
enum:
- accepted
- rejected
接下来,生成的类型不包括在{{{imports}}中,因此需要手动处理。
此外,在生成器类型定义中,标题类型描述似乎不可撤销地丢失了。
最后,现在我不明白一个正确的Java/WebFlux特定API方法定义应该是什么样子。
我可以在@apisresponse
定义中包含响应负责人
,如下所示:
@ApiResponse(value = 204,
responseHeaders = {
@ResponseHeader(name = "ETag", response = String.class),
@ResponseHeader(name = "Repeatability-Result", response = org.example.RepeatabilityResult.class)
},
message = ....
)
<webflux-specific API method declaration>
但是它似乎只是为了提供信息,并没有带来任何新的功能。人们仍然需要手动为响应添加必要的标题,而不需要框架的任何支持/验证。
我可以向OpenAPI生成器提交一个bug,但首先我想了解一个合适的解决方案是什么样子的。
我有一个这样的歌剧API: OpenAPI生成器Maven的插件为schema对象创建了一个请求类“GenerateTokenRequest”,但在API实现类中它没有使用。它生成一个方法,将所有请求的字段作为参数列表。方法如下: 所以,在这种情况下,请求类“GenerateTokenRequest”被生成,但从未使用过。任何人都可以告诉我为什么?有一种使用我的请求类的替代方法吗?我可以在Open
我在openapi v.3规范中有一个模型。我使用openapi生成器maven插件为库webclient(spring 5-webflux)生成java客户端。我想发送回客户端文件和http头。生成的代码没有获取响应标头的方法。 为客户端生成的代码不包含提供对响应头访问的代码。例如,如果我使用库resttemplate,则有一个方法public MultiValueMap getResponse
我试图用openApI3生成一个python客户端库。为此,我创建了一个openapi.yml文件,在其中我定义了带有请求和响应的url和模式。 我正在尝试使用我在这里找到的openApI生成器https://github.com/OpenAPITools/openapi-generator命令:openapitools/openapi生成器cli 这个生成器根据yml文件中定义的模式生成一组目录
我想创建一个gradle java应用程序,它从一个openAPI规范文件生成一个客户端,并使用该客户端。所以我用gradle init创建了一个java应用程序(类型:应用程序,语言:Java,DSL:groovy,测试框架:JUnit Jupiter,项目名称:简单-java-app,包结构:)。 我可以用一个包和一个类创建一个新的源文件夹。并使用以下 主类可以访问: 现在,我尝试对opena
我正在使用 https://github.com/OpenAPITools/openapi-generator 为我的应用编程接口创建一个客户端。它基本上工作正常,但是生成器创建了许多类型,这些类型封装了包括任何复杂性类型的参数,例如、、 例如 其中InlineObject11定义为 这有什么意义?为什么生成的客户端不接受流再平衡贸易文件(Stream rebalanceTradeFile),而不
嗯,首先,对不起我的英语不好。 “enderecodao.java”: 和ENDERECO的WebService“servicoEnderEco.java”: