我正在尝试使用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)。