当前位置: > > > SpringCloud - 声明式服务调用组件Feign使用详解2(参数绑定)

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-SERVICEFEIGN-CONSUMER,访问 http://localhost:9001/feign-consumer 触发对 HELLO-SERVICE 接口的调用,最终会获得如下输出,代表接口绑定和调用成功。
评论0