文章目录
- 概述
- 调用顺序
- Feign构造多参数GET请求
- url参数和方法参数一一对应
- map接收
- Feign构造多参数POST请求
- 源码
概述
Spring Cloud-06服务消费者整合Feign中将消费者和Feign整合在了一起,示例中Feign客户端接口中的参数只有1个,如下
实际开发中,多个请求非常常见,如果请求参数有多个呢? 我们使用Feign该如何调用请求呢?
调用顺序
当浏览器或者外部其他请求请求到MovieController,MovieController需要调用UserController服务提供者提供的服务,MovieController会通过接口UserFeignClient来实现调用。 在UserFeignClient接口方法里,通过映射UserController的REST API实现调用对端服务。
服务端对外提供的rest风格的请求如下
Feign构造多参数GET请求
我们知道Spring Cloud为Feign添加了Spring MVC的注解支持,那按照Spring MVC那种写法试试?
MovieController中定义一个接受外部请求的方法,映射/movie/getA的请求
代码语言:javascript复制@RestController
@Slf4j
public class MovieController {
@Autowired
private UserFeignClient userClient;
@GetMapping("/movie/getA")
public User findUser(User user) {
log.info("get进入服务消费者 MovieController.findUser");
return userClient.finUser(user);
}
}
在Feign接口中,定义finUser方法,和服务端UserController暴露的url一致
代码语言:javascript复制@FeignClient("microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(method = RequestMethod.GET, value = "/get")
public User finUser(User user);
}
可以看到 value = “/get” ,和服务提供者的请求url保持一致,这样就能可以调用到该服务。
那试下吧
- 启动microservice-discovery-eureka微服务,Eureka Server
- 启动micorservice-provider-user,服务提供者
- 启动micorservice-consumer-movie-fegin,服务消费者
访问 http://localhost:7901/movie/getA?username=小工匠&age=10
传递了2个参数,都是User类的两个属性,按照Spring MVC的逻辑,肯定是可以自动转换的,但这里报错了
尽管我们指定了GET方法,Feign依然会使用POST方法发送请求。
那该如何写呢?
url参数和方法参数一一对应
URL有几个参数,Feign接口中的方法就有几个参数。使用@RequestParam注解指定请求的参数是什么
MovieController层
Feign接口
代码语言:javascript复制 /**
*
* @param username
* @param age
* @return
* @desc get的url中有几个参数,Feign接口的方法中就定义几个参数,使用@RequestParam注解指定请求的参数是什么
* 必须要加上@RequestParam注解,否则启动报错。
*
*/
@RequestMapping(method = RequestMethod.GET, value = "/get")
public User finUser(@RequestParam("username") String username ,@RequestParam("age") Integer age);
服务提供者保持不变。
- 启动microservice-discovery-eureka微服务,Eureka Server
- 启动micorservice-provider-user,服务提供者
- 启动micorservice-consumer-movie-fegin,服务消费者
访问 http://localhost:7901/movie/getB?username=小工匠&age=10
map接收
多参数的URL也可使用Map来构建。当目标URL参数非常多的时候,可使用这种方式简化Feign接口的编写。
MovieController增加个新的方法便于测试
代码语言:javascript复制 @GetMapping("/movie/getC")
public User findUser3(User user) {
log.info("get2进入服务消费者 MovieController.findUser3");
Map<String, Object> map = new HashMap<String, Object>() {
{
put("username",user.getUsername());
put("age",user.getAge());
}
};
return userClient.finUser(map);
}
Feign接口
代码语言:javascript复制 /**
*
* @param map
* @return
* @desc 使用map来接收get请求的多个参数,@RequestParam不可少
*/
@RequestMapping(method = RequestMethod.GET, value = "/get")
public User finUser(@RequestParam Map<String, Object> map);
服务提供者保持不变。
- 启动microservice-discovery-eureka微服务,Eureka Server
- 启动micorservice-provider-user,服务提供者
- 启动micorservice-consumer-movie-fegin,服务消费者
http://localhost:7901/movie/getC?username=小工匠xxxx&age=9999
Feign构造多参数POST请求
如何使用Feign构造包含多个参数的POST请求 ?
假设服务提供者的Controller是这样编写的:
代码语言:javascript复制@RestController
public class UserController {
@PostMapping("/post")
public User post(@RequestBody User user) {
...
}
}
如何使用Feign去请求呢?
代码语言:javascript复制@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/post", method = RequestMethod.POST)
public User post(@RequestBody User user);
}
用POSTMAN模拟下即可 ,注意Body是JSON格式
实际工作中的使用
源码
https://github.com/yangshangwei/SpringCloudMaster