解决SpringCloud feign GET请求变成POST的问题

背景

在开发的过程中发现,在使用Feign的时候,使用@GetMapping("/user")的时候,日志打印出来确实发送了POST请求。

解决方案

GET请求多参数URL

方法一(推荐)

推荐使用@SpringQueryMap,可以把多个参数包装成对象,没有值的时候默认为null。

@FeignClient(“/user”)
public interface UserFeignClient {
    @GetMapping("/get")
    public User get(@SpringQueryMap User user);
}

方法二(推荐)

@FeignClient(name = “/user”)
public interface UserFeignClient {
    @GetMapping(“/get”)
    public User get1(@RequestParam(“id”) Long id, @RequestParam(“username”) String username);
}

这是最为直观的方式,URL有几个参数,Feign接口中的方法就有几个参数。使用@RequestParam注解指定请求的参数是什么。 缺点:参数多的时候,导致方法参数过多。

方法三(不推荐)

多参数的URL也可使用Map来构建。当目标URL参数非常多的时候,可使用这种方式简化Feign接口的编写。

@FeignClient(name = “microservice-provider-user”)
public interface UserFeignClient {
    @GetMapping(“/get”)
    public User get2(@RequestParam Map<String, Object> map);
}

在调用时,可使用类似以下的代码。

注意:这种方式不建议使用。主要是因为可读性不好,而且如果参数为空的时候会有一些问题,例如map.put(“username”, null); 会导致microservice-provider-user 服务接收到的username"" ,而不是null

总结

在参数比较少的时候,建议使用@RequestParam,比较直观。在参数超过3个的时候,建议使用
@SpringQueryMap封装成对象。


作者:糊涂啊肥
原文:SpringCloud feign GET请求变成POST解决方案