#spring #spring-boot #spring-cloud #spring-cloud-feign
#spring #весенняя загрузка #spring-облако #spring-cloud-feign
Вопрос:
Я столкнулся с проблемой, заключающейся в том, что мои запросы GET менялись на POST из-за RequestHeader и PathVariable, которые интерпретировались как тело запроса в Feign Client.
Перехватчик
public class OpenFeignConfiguration implements RequestInterceptor {
@Value("${key:}")
private String key;
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
@Override
public void apply(RequestTemplate template) {
template.header("key", key);
}
}
И клиент Feign
@FeignClient(name = "feignClient", url = "${client.url}", configuration = OpenFeignConfiguration.class)
public interface FeignClient {
@GetMapping(value = "/path/?test=({var1} and {var2})")
public Object test(String body, @PathVariable("var1") String var1, @PathVariable("var2") String var2);
}
Ответ №1:
Решение, которое я нашел, заключается в том, что вам нужно изменить Springs Feign contract на Feign one, чтобы:
public class OpenFeignConfiguration implements RequestInterceptor {
@Value("${key:}")
private String key;
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
@Bean
public Contract feignContract() {
return new Contract.Default();
}
@Override
public void apply(RequestTemplate template) {
template.header("key", key);
}
}
И теперь клиент должен использовать аннотацию Feign:
@FeignClient(name = "feignClient", url = "${client.url}", configuration = OpenFeignConfiguration.class)
public interface FeignClient {
@RequestLine("GET /path/?test=({var1} and {var2})")
public Object test(@Param("var1") String originator, @Param("var2") String receiver);
}
Надеюсь, это поможет всем, у кого такая же проблема, как у меня.