SpringCloud - 声明式服务调用组件Feign使用详解2(参数绑定)
在上一篇文章中我们使用 Spring Cloud Feign 实现一个不带参数的 REST 服务绑定。在实际开发中,各种业务接口会复杂许多,我们会在 HTTP 的各个位置传入各种不同类型的数据,并且返回的结果可能是一个复杂的对象结构。下面通过样例演示 Feign 中对几种不同形式参数的绑定方法。
二、参数绑定
1,服务提供者改造
(1)首先扩展下服务提供方 hello-service,增加如下几个接口:
@RestController public class HelloController { // 带有Request参数的请求 @GetMapping("/hello1") public String hello1(@RequestParam String name) { return "hello1 " + name; } // 带有Header信息的请求 @GetMapping("/hello2") public User hello2(@RequestHeader String name, @RequestHeader Integer age) { return new User(name, age); } // 带有Body信息的请求 @PostMapping("/hello3") public String hello3(@RequestBody User user) { return "hello3 " + user.getName() + ", " + user.getAge(); } }
(2)User 对象的定义如下:
注意:这里必须要有 User 的默认构造函数。不然,Spring Cloud Feign 根据 JSON 字符串转换 User 对象时会抛出异常。
@Getter @Setter @AllArgsConstructor @NoArgsConstructor @ToString public class User { private String name; private Integer age; }
2,服务消费者改造
(1)首先在 feign-consumer 中创建同上面一样的 User 类。(2)接着在 HelloService 接口中增加对上述三个新增接口的绑定声明:
注意:在定义各参数绑定时,@RequestParam、@RequestHeader 等可以指定参数名称的注解,它们的 value 不能为空。虽然在 Spring MVC 程序中,这些注解会根据参数名来作为默认值,但是在 Feign 中绑定参数必须通过 value 属性来指明具体参数名,不然会抛出 IllegalStateException 异常。
@FeignClient("hello-service") public interface HelloService { // 带有Request参数的接口 @GetMapping("/hello1") String hello1(@RequestParam("name") String name); // 带有Header信息的接口 @GetMapping("/hello2") User hello2(@RequestHeader("name") String name, @RequestHeader("age") Integer age); // 带有Body信息的接口 @PostMapping("/hello3") String hello3(@RequestBody User user); }
(3)最后在 ConsumerController 中对这些新增的接口进行调用:
@RestController public class ConsumerController { @Autowired HelloService helloService; @GetMapping(value = "/feign-consumer") public String helloConsumer() { String result1 = helloService.hello1("hangge1"); User result2 = helloService.hello2("hangge2", 100); String result3 = helloService.hello3(new User("hangge3",0)); return result1 + "<br>" + result2 + "<br>" +result3; } }
3,验证测试
我们启动服务中心、HELLO-SERVICE、FEIGN-CONSUMER,访问 http://localhost:9001/feign-consumer 触发对 HELLO-SERVICE 接口的调用,最终会获得如下输出,代表接口绑定和调用成功。