没有URL解码的FeignClient RequestParam

时间:2019-10-09 01:39:32

标签: spring-boot spring-cloud-feign

我正在尝试使用Spring Boot与不支持编码URL的后端服务器进行通信。我尝试拦截RestTemplate并修改查询参数,但它似乎不起作用。正确的做法应该是什么?

伪装客户的代码是

@FeignClient(url = "${gateway.api}",
configuration = BackendConfig.class)
@RequestMapping("/v1/")
public interface GatewayClient {
    @GetMapping(path = "/authorize")
    String getAuthorization(@RequestParam(name = "cburl") String url);
}

现在,如果我调用GatewayClient.authorize("http://example.com"),我可以看到它被称为${gateway.api}/v1/authorize?cburl=http:%2F%2Fexample.com,后端服务无法识别它。但是,$(gateway.api}/v1/authorize?cburl=http://example.com有用。

下面给出BackendConfig类以供参考

class BackendConfig {
    @Autowired 
    ObjectFactory<HttpMessageConverters> messageConverters;

    @Bean
    public Decoder springDecoder() { return new ResponseEntityDecover(new SpringDecoder(messageConverters); }
    @Bean
    public MyInterceptor requestInterceptor() {
        return new MyInterceptor();
    }

    public class MyInterceptor implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate template) {
            String lines;
            try {
                lines = URLDecoder.decode(String.valueOf(template.queries().get("url")), "UTF-8");
                template.queries.put("url", Collections.singletonList(lines));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    }
}

但是我收到UnsupportedOperationException,并且我相信目前我无法修改查询。任何建议都将受到高度赞赏。 (您会注意到查询参数按原样保留':'(冒号),而不是将其编码为%3A)。

0 个答案:

没有答案