SpringCloud Feign参数传递问题

2022-08-07 11:29:38
前言:
  • 在SpringCloud中我们调用服务时往往会使用Feign客户端替代RestTemplate手动调用,我们只需要定义接口,接口上使用@FeignClient(“服务名”)注解即可,Feign会帮我们生成动态代理(使用JDK 的动态代理),生成的代理类,会将请求的信息封装,交给 feignClient 接口发送请求。
1.Feign不支持GET方法传递POJO
  • 由于springMVC是支持GET方法直接绑定POJO的,只是feign实现并未覆盖所有springMVC特效,网上的很多变通方法都不是很好,要么是吧POJO拆散成一个一个单独的属性放在方法参数里,要么是把方法参数变成Map,要么就是要违反HTTP协议,GET传递@RequestBody:

spring MVC 不支持继承接口中方法参数上的注解(支持继承类、方法上的注解),所以使用Feign调用接口时无法直接传递Pojo

解决方式1
  • 传递Map<Stiring,Object>参数。使用Map<String,Object>将参数封装,然后在接口方法参数中直接传递Map,并使用@RequestParma 注解。
    这种方式已经是最接近Pojo方式了,有一个小问题,就是多个name相同时,使用String[]数组装name的多个value值,Feign无法正常绑定参数。

/**
 * @author wx
 * 调用订单服务
 */
@FeignClient("PAY-ORDER")   //服务名
public interface OrderService {

    /**
     * 商户支付订单列表查询
     * @return
     */
    @GetMapping("/order/list")
    ReturnData<OrderDto> merchPayOrderList(@RequestParam Map<String,Object> map);
}
解决方式2
2. Feign调用get请求接口传递多个参数 @RequestParma(“参数名”)

注意: 使用@RequestParam注解时必须要在后面加上参数名,与前台传来的name一致。
缺点:此种方式若参数过多,会非常繁琐,代码可读性差。

@FeignClient("PAY-ORDER")   //服务名
public interface OrderService {

    /**
     * 商户支付订单列表查询
     * @return
     */
    @GetMapping("/order/list")
    ReturnData<OrderDto> merchPayOrderList(@RequestParma("currPage") String currPage, @RequestParam(pageSize) String pageSize);
}

注意:@RequestParma("currPage") 中的currPage是外部识别的参数名     String currPage是用来接收值的
3. Feign调用get请求接口传递单个参数 @PathVariable

使用@PathVariable可以用来映射URL中的占位符到目标方法的参数中

@FeignClient("PAY-ORDER")   //服务名
public interface OrderService {

    /**
     * 商户支付订单列表查询
     * @return
     */
    @GetMapping("/order/list/{id}")
    ReturnData<OrderDto> merchPayOrderList(@PathVariable("id") Integer id);
}
4. Feign调用Post请求接口传递对象(Pojo) @RequestBody

@RequestBody表示接收一个请求参数 content-type类型为application/json 的参数,表示请求内容的类型为 json

@FeignClient("PAY-ORDER")   //服务名
public interface OrderService {

    /**
     * 商户支付订单列表查询
     * @return
     */
    @PostMapping("/order/list")
    ReturnData<OrderDto> merchPayOrderList(@RequestBody User user);   //使用@RqeuestBody注解,传入一个User对象
}

注意:提供者的接口参数也应该使用@RequestBody注解

其他参考链接:
https://www.jianshu.com/p/7ce46c0ebe9d
http://www.itmuch.com/spring-cloud-sum/feign-multiple-params/ 如何使用Feign构造多参数的请求

  • 作者:王小白_Ada
  • 原文链接:https://blog.csdn.net/qq_38252039/article/details/88583625
    更新时间:2022-08-07 11:29:38