闲来无事,记录一下自己爬得坑,如有说的不清楚得地方还请谅解~
1,把GET改成POST,把方法上参数实体类加上@RequstBodY,这是最快速得方案
2,如果必须用GET,又想用实体类作为参数请用第二套方案
(1),须在实体类前加注解**@SpringQueryMap**
(2),加一个配置类代码如下
@Configuration
public class FeignClientCustomizerConfig {
/**
* 替换解析 queryMap 的类,实现父类中变量的映射
* @return
*/
@Bean
public Feign.Builder feignBuilder() {
return Feign.builder()
.queryMapEncoder(new BeanQueryMapEncoder());
}
}
(3),在把这个配置类配置到你远程调用得FeignClient接口上如以下代码
@FeignClient(
name = "${DemoFeign}",
url = "${DemoFeign.url:}",
path = "${DemoFeign:base}",
contextId = "DemoFeign",
fallbackFactory = DemoFeignFallBack.class,
configuration = {FeignClientCustomizerConfig.class}
)
public interface DemoFeign {
/**
* demo
*
* @param req
* @return
*/
@GetMapping(value = "/get-demo")
Result<Demo> getBrandTenantCpInfo(@SpringQueryMap Demo req);
}
翻看源码,发现feign默认的远程调用使用的是jdk底层的HttpURLConnection,这在feign-core包下的Client接口中的convertAndSend方法可看到:
该段代码片段会判断requestBody是否为空,我们知道GET请求默认是不会有requestBody的,因此该段代码会执行到HttpURLConnection中的 private synchronized OutputStream getOutputStream0() throws IOException; 方法:
if (this.method.equals(“GET”)) {
this.method = “POST”;
}
最关键的代码片段已显示当请求方式为GET请求,会将该GET请求修改为POST请求!