SpringCloud - 声明式服务调用组件Feign使用详解2(参数绑定)
作者:hangge | 2020-07-29 08:10
在上一篇文章中我们使用 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 接口的调用,最终会获得如下输出,代表接口绑定和调用成功。
全部评论(0)