FeignClient RequestParam без URL-кода - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь использовать 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).

...