欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 前端技术 > javascript >内容正文

javascript

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

发布时间:2025/3/21 javascript 33 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Spring Cloud【Finchley】-07Feign构造多参数GET/POST请求 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • 概述
  • 调用顺序
  • 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的请求

@RestController @Slf4j public class MovieController {@Autowiredprivate 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保持一致,这样就能可以调用到该服务。

那试下吧

  • 启动microservice-discovery-eureka微服务,Eureka Server
  • 启动micorservice-provider-user,服务提供者
  • 启动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);

    服务提供者保持不变。

  • 启动microservice-discovery-eureka微服务,Eureka Server
  • 启动micorservice-provider-user,服务提供者
  • 启动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);

    服务提供者保持不变。

  • 启动microservice-discovery-eureka微服务,Eureka Server
  • 启动micorservice-provider-user,服务提供者
  • 启动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

    总结

    以上是生活随笔为你收集整理的Spring Cloud【Finchley】-07Feign构造多参数GET/POST请求的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。