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