OpenFeign在不同场景下的参数传递方式

 更新时间:2026年06月14日 14:41:02   作者:椰椰椰耶  
这篇文章主要介绍了使用Feign进行参数传递的方法,包括单个参数、多个参数、对象及JSON的传递方式,并提出了通过接口继承简化代码写法的最佳实践,需要的朋友可以参考下

OpenFeign 参数传递

通过观察,我们也可以发现,Feign 的客户端和服务提供者的接口非常相似。上面例子中,演示了 FeignURL 中获取参数,接下来演示 Feign 参数传递的其他方法

  • 只做代码演示,不做功能

传递单个参数

服务提供方:product-service

@RequestMapping("/product")  
@RestController  
public class ProductController {  
    @RequestMapping("/p1")  
    public String p1(Integer id){  
        return "p1 接收到参数:" + id;  
    }  
}

Feign 客户端

@FeignClient(value = "product-service", path = "/product")  
public interface ProductApi {  

    @RequestMapping("/p1")  
    String p1(@RequestParam("id") Integer id);  
}
  • @RequestParam 做参数绑定,不能省略

服务消费方:order-service

@RequestMapping("/feign")  
@RestController  
public class TestFeignController {  
    @Autowired  
    private ProductApi productApi;  
      
    @RequestMapping("/o1")  
    public String o1(Integer id) {  
        return productApi.p1(id);  
    }  
}

测试远程调用: http://127.0.0.1:8080/feign/o1?id=5

传递多个参数

使用多个 @RequestParam 进行参数绑定即可

服务提供方 product-service

@RequestMapping("/p2")  
public String p2(Integer id, String name) {  
    return "p2 接受到参数,id:" + id + ", name: " + name;  
}

Feign 客户端

@RequestMapping("/p2")  
String p2(@RequestParam("id") Integer id, @RequestParam("name") String name);

服务消费方 order-service

@RequestMapping("/o2")  
public String o2(Integer id, String name) {  
    return productApi.p2(id, name);  
}

测试远程调用: http://127.0.0.1:8080/feign/o2?id=5&name=zhangsan

传递对象

服务提供方 product-service

@RequestMapping("/p3")  
public String p3(ProductInfo productInfo) {  
    return "接收到对象,productInfo:" + productInfo;  
}

Feign 客户端

@RequestMapping("/p3")  
String p3(@SpringQueryMap ProductInfo productInfo);

服务消费方 order-service

@RequestMapping("/o3")  
public String o3(ProductInfo productInfo) {  
    return productApi.p3(productInfo);  
}

测试远程调用: http://127.0.0.1:8080/feign/o3?id=5&productName=zhangsan

传递 JSON

服务提供方 product-service

@RequestMapping("/p4")  
public String p4(@RequestBody ProductInfo productInfo) {  
    return "接收到对象,productInfo: " + productInfo;  
}

Feign 客户端

@RequestMapping("/p4")  
    String p4(@RequestBody ProductInfo productInfo);  
}

服务消费方 order-service

@RequestMapping("/o4")
public String o4(@RequestBody ProductInfo productInfo) {  
    System.out.println(productInfo.toString());  
    return productApi.p4(productInfo);  
}

测试远程调用: http://127.0.0.1:8080/feign/o4

最佳实践

最佳实践,其实也就是经过历史的迭代,在项目中的事件过程中,总结出来的最好的使用方式

通过观察,我们也能看出来,Feign 的客户端与服务提供者的 controller 代码非常相似

  • Feign 客户端
@FeignClient(value = "product-service", path = "/product")  
public interface ProductApi {  
    @RequestMapping("/{productId}")  
    ProductInfo getProductById(@PathVariable("productId") Integer productId);
}
  • 服务提供方 controller
  
@RequestMapping("/product")  
@RestController  
public class ProductController {  
    @RequestMapping("/{productId}")  
    public ProductInfo getProductById(@PathVariable("productId") Integer productId) {
    //...
}

有没有一种方法可以简化这种写法呢

Feign 继承方式

Feign 支持继承的方式,我们可以把一些常见的操作封装到接口里

我们可以定义好一个接口,服务提供方实现这个接口,服务消费方编写 Feign 接口的时候,直接继承这个接口

创建一个 Module

接口可以放在一个公共的 Jar 包里,供服务提供方和服务消费方使用

引入依赖

<dependencies>
    <!-- Spring Boot Web Starter for web capabilities -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Cloud OpenFeign for declarative REST client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

编写接口

复制 ProductApiProductInfoproduct-api 模块中

package org.example;  
  
import org.example.model.ProductInfo;  
import org.springframework.cloud.openfeign.SpringQueryMap;  
import org.springframework.web.bind.annotation.PathVariable;  
import org.springframework.web.bind.annotation.RequestBody;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestParam;  
  
public interface ProductInterface {  
    @RequestMapping("/{productId}")  
    ProductInfo getProductById(@PathVariable("productId") Integer productId);  
  
    @RequestMapping("/p1")  
    String p1(@RequestParam("id") Integer id);  
  
    @RequestMapping("/p2")  
    String p2(@RequestParam("id") Integer id, @RequestParam("name") String name);  
  
    @RequestMapping("/p3")  
    String p3(@SpringQueryMap ProductInfo productInfo);  
  
    @RequestMapping("/p4")  
    String p4(@RequestBody ProductInfo productInfo);  
}

目录结构为:

以上就是OpenFeign在不同场景下的参数传递方式的详细内容,更多关于OpenFeign参数传递方式的资料请关注脚本之家其它相关文章!

相关文章

  • java利用socket通信实现Modbus-RTU通信协议的示例代码

    java利用socket通信实现Modbus-RTU通信协议的示例代码

    这篇文章主要介绍了java利用socket通信实现Modbus-RTU通信协议的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • MyBatis-Plus使用sl4j日志打印SQL的代码详解

    MyBatis-Plus使用sl4j日志打印SQL的代码详解

    以下是关于使用 Spring Boot 起始器替换 slf4j-api 和 logback 依赖的详细步骤和注意事项,包括 MyBatis-Plus 的默认日志级别信息,需要的朋友可以参考下
    2024-10-10
  • java自定注解完整示例代码

    java自定注解完整示例代码

    Java注解是一种元数据,可以提供有关程序代码的额外信息,它们可以用于标记类、方法、字段等元素,它允许我们在源代码中嵌入元数据这篇文章主要介绍了java自定注解的相关资料,需要的朋友可以参考下
    2026-01-01
  • spring Boot与Mybatis整合优化详解

    spring Boot与Mybatis整合优化详解

    关于spring-boot与mybatis整合优化方面的介绍,就是Mybatis-Spring-boot-starter的介绍,具体内容详情大家参考下本文
    2017-07-07
  • Spring boot2X Consul如何使用Feign实现服务调用

    Spring boot2X Consul如何使用Feign实现服务调用

    这篇文章主要介绍了spring boot2X Consul如何使用Feign实现服务调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringBoot中使用@Async实现异步调用​方法示例

    SpringBoot中使用@Async实现异步调用​方法示例

    在Spring Boot中异步调用是通过Spring的@Async注解来实现的,它允许我们在不阻塞主线程的情况下执行耗时的操作,这篇文章主要介绍了SpringBoot中使用@Async实现异步调用​方法的相关资料,需要的朋友可以参考下
    2025-12-12
  • Java使用keySet方法获取Map集合中的元素

    Java使用keySet方法获取Map集合中的元素

    这篇文章主要为大家详细介绍了Java使用keySet方法获取Map集合中的元素,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • JAVA Comparator 和 Comparable接口使用方法

    JAVA Comparator 和 Comparable接口使用方法

    本文介绍了Java中Comparable和Comparator接口的使用,包括它们的定义、方法和应用场景,Comparable用于定义类的自然排序规则,而Comparator提供了一种灵活的方式来定义对象之间的排序规则,无需修改类本身,感兴趣的朋友一起看看吧
    2025-03-03
  • Mybatis实体类属性与数据库不一致解决方案

    Mybatis实体类属性与数据库不一致解决方案

    这篇文章主要介绍了Mybatis实体类属性与数据库不一致解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 如何在java文件中设置文字颜色:setTextColor()

    如何在java文件中设置文字颜色:setTextColor()

    这篇文章主要介绍了如何在java文件中设置文字颜色:setTextColor(),文末补充介绍了在java代码中设置字体颜色方法总结,结合实例代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09

最新评论