前言:
- 在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
- 使用feign拦截器https://www.jianshu.com/p/085c11e5722f
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构造多参数的请求