ПОЛУЧИТЬ превращение в POST с помощью Spring Feign

#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);
}
  

Надеюсь, это поможет всем, у кого такая же проблема, как у меня.