Spring Cloud【Finchley】-07Feign构造多参数GET/POST请求

举报
小工匠 发表于 2021/09/09 23:10:58 2021/09/09
【摘要】 文章目录 概述调用顺序Feign构造多参数GET请求url参数和方法参数一一对应map接收 Feign构造多参数POST请求源码 概述 Spring Cloud-06服务消费者整...


在这里插入图片描述

概述

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的请求

@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一致


@FeignClient("microservice-provider-user")
public interface UserFeignClient {
	@RequestMapping(method = RequestMethod.GET, value = "/get")
	public User finUser(User user);
}

  

可以看到 value = “/get” ,和服务提供者的请求url保持一致,这样就能可以调用到该服务。
在这里插入图片描述

那试下吧

  1. 启动microservice-discovery-eureka微服务,Eureka Server
  2. 启动micorservice-provider-user,服务提供者
  3. 启动micorservice-consumer-movie-fegin,服务消费者

访问 http://localhost:7901/movie/getA?username=%E5%B0%8F%E5%B7%A5%E5%8C%A0&age=10

传递了2个参数,都是User类的两个属性,按照Spring MVC的逻辑,肯定是可以自动转换的,但这里报错了
在这里插入图片描述

尽管我们指定了GET方法,Feign依然会使用POST方法发送请求。

那该如何写呢?

url参数和方法参数一一对应

URL有几个参数,Feign接口中的方法就有几个参数。使用@RequestParam注解指定请求的参数是什么

MovieController层
在这里插入图片描述

Feign接口

	/**
	 * 
	 * @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);
	

  

在这里插入图片描述

服务提供者保持不变。

  1. 启动microservice-discovery-eureka微服务,Eureka Server
  2. 启动micorservice-provider-user,服务提供者
  3. 启动micorservice-consumer-movie-fegin,服务消费者

访问 http://localhost:7901/movie/getB?username=%E5%B0%8F%E5%B7%A5%E5%8C%A0&age=10

在这里插入图片描述


map接收

多参数的URL也可使用Map来构建。当目标URL参数非常多的时候,可使用这种方式简化Feign接口的编写。

MovieController增加个新的方法便于测试

  @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接口

	/**
	 * 
	 * @param map
	 * @return
	 * @desc 使用map来接收get请求的多个参数,@RequestParam不可少
	 */
	@RequestMapping(method = RequestMethod.GET, value = "/get")
	public User finUser(@RequestParam Map<String, Object> map);

  

服务提供者保持不变。

  1. 启动microservice-discovery-eureka微服务,Eureka Server
  2. 启动micorservice-provider-user,服务提供者
  3. 启动micorservice-consumer-movie-fegin,服务消费者

http://localhost:7901/movie/getC?username=%E5%B0%8F%E5%B7%A5%E5%8C%A0xxxx&age=9999

在这里插入图片描述


Feign构造多参数POST请求

如何使用Feign构造包含多个参数的POST请求 ?

假设服务提供者的Controller是这样编写的:

@RestController
public class UserController {
  @PostMapping("/post")
  public User post(@RequestBody User user) {
    ...
  }
}

  

如何使用Feign去请求呢?

@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

文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。

原文链接:artisan.blog.csdn.net/article/details/85034397

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。