使用Feign @RequestLine添加decodeSlash

问题描述 投票:0回答:3

我目前正在使用 YAML 文件使用 swagger 插件生成模型和 API 客户端,并且使用 Feign OkHttpClient 向 API 发出请求,这里的问题是客户端对 URL 进行编码,但忽略了斜线API 调用失败。有没有办法在客户端添加

decodeSlash
参数?或者可以使用拦截器来实现吗?

这是我遇到此问题的示例路径参数。

QgKuK2DU/0%3D
应该在哪里
QgKuK2DU%2F0%3D

java yaml okhttp rest-client feign
3个回答
0
投票

decodeSlash
只能通过
@RequestLine
注释进行设置。如果您无权访问注释,则需要使用
uri
替换
RequestInterceptor


0
投票

如果您使用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>

0
投票

您可以在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);
          }
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.