Feign调用GET请求找不到请求体实体类,会被转成POST

闲来无事,记录一下自己爬得坑,如有说的不清楚得地方还请谅解~
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请求!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值