我目前正在使用 YAML 文件使用 swagger 插件生成模型和 API 客户端,并且使用 Feign OkHttpClient 向 API 发出请求,这里的问题是客户端对 URL 进行编码,但忽略了斜线API 调用失败。有没有办法在客户端添加
decodeSlash
参数?或者可以使用拦截器来实现吗?
这是我遇到此问题的示例路径参数。
QgKuK2DU/0%3D
应该在哪里 QgKuK2DU%2F0%3D
decodeSlash
只能通过 @RequestLine
注释进行设置。如果您无权访问注释,则需要使用 uri
替换 RequestInterceptor
。
如果您使用openapi-generator,您可以自己修改模板(也在此处进行了描述)以添加
decodeSlash
参数:
git clone https://github.com/openapitools/openapi-generator
cd openapi-generator
git checkout v4.2.0 # The Version Tag you are actually using
cd modules/openapi-generator/src/main/resources/Java/libraries/feign/
cp api.mustache <your_local_project>/src/main/resources/Java/libraries/feign
在
api.mustache
中更改@RequestLine
的2个外观:
- @RequestLine("{{httpMethod}} {{{path}}}{{#hasQueryParams}}?{{/hasQueryParams}}{{#queryParams}}{{baseName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{#hasMore}}&{{/hasMore}}{{/queryParams}}")
+ @RequestLine(value="{{httpMethod}} {{{path}}}{{#hasQueryParams}}?{{/hasQueryParams}}{{#queryParams}}{{baseName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{#hasMore}}&{{/hasMore}}{{/queryParams}}", decodeSlash = false)
- @RequestLine("{{httpMethod}} {{{path}}}?{{#queryParams}}{{baseName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{#hasMore}}&{{/hasMore}}{{/queryParams}}")
+ @RequestLine(value="{{httpMethod}} {{{path}}}?{{#queryParams}}{{baseName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{#hasMore}}&{{/hasMore}}{{/queryParams}}", decodeSlash = false)
使用
openapi-generator-maven-plugin
将 templateDirectory
添加到 <configuration>
块:
<templateDirectory>src/main/resources/Java/libraries/feign</templateDirectory>
您可以在Feign客户端界面中配置合约并打开解码斜线:
@FeignClient(name = "yourClient", url= "xxxx", configuration = YourClient.ClientConf.class)
public interface YourClient {
class ClientConf{
@Bean
Contract contract(@Autowired(required = false) List<AnnotatedParameterProcessor> parameterProcessors,
ConversionService feignConversionService) {
if (parameterProcessors == null) {
parameterProcessors = new ArrayList<>();
}
return new SpringMvcContract(parameterProcessors, feignConversionService, false);
}
}
}