当前位置: 首页
编程语言
OpenFeign多场景参数传递方式详解

OpenFeign多场景参数传递方式详解

热心网友 时间:2026-06-18
转载

OpenFeign提供多种参数传递:单参用@RequestParam绑定,多参用多个@RequestParam,对象用@SpringQueryMap自动映射,JSON使用@RequestBody。最佳实践通过接口继承将公共API抽离为独立模块,实现统一管理与复用,减少重复代码,提升可维护性。支持GET POST请求,注解配置灵活,适合微服务间调用。

OpenFeign 参数传递详解:多种传参方式与最佳实践

仔细观察可以发现,Feign 客户端与服务提供者的接口在结构上非常相似。前面我们已经演示了如何从 URL 中提取参数,接下来将深入介绍其他几种常见的参数传递方式。以下示例侧重于展示代码的编写模式,并不涉及具体的业务逻辑实现。

传递单个参数

服务提供端 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

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

传递多个参数

当需要传递多个参数时,可以分别使用多个 @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

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

传递对象参数

服务提供端 product-service 接收对象参数的方式:

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

Feign 客户端使用 @SpringQueryMap 注解传递对象:

@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

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

传递 JSON 数据

服务提供端 product-service 通过 @RequestBody 接收 JSON 格式的对象:

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

Feign 客户端同样使用 @RequestBody 传递 JSON 数据:

@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

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

Feign 最佳实践指南

所谓最佳实践,是指项目在持续演进中沉淀下来的最简洁、最高效的编码方式。从前面的示例中可以看出,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 原生支持接口继承机制,通过它将公共的 API 定义抽取到统一的位置。服务提供者负责实现该接口,而服务消费者则通过继承该接口来定义 Feign 客户端,从而避免重复编写相似的代码。

创建独立模块

将公共接口封装到一个独立的 Jar 包中,供服务提供方和消费方共同引用。

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

添加项目依赖


    
    
        org.springframework.boot
        spring-boot-starter-web
    
    
    
        org.springframework.cloud
        spring-cloud-starter-openfeign
    

定义公共接口

ProductApiProductInfo 迁移至 product-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 在多种场景下参数传递方式的全面解析,更多关于 OpenFeign 参数传递的进阶技巧,请参考后续的专题文章。

来源:https://www.jb51.net/program/365752eft.htm

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
用 LlamaIndex 做 RAG 前,先把 Reader、Index、Retriever 的边界写清楚

用 LlamaIndex 做 RAG 前,先把 Reader、Index、Retriever 的边界写清楚

LlamaIndex 不适合用“5 行代码做一个 RAG demo”来判断好坏。那个 demo 只能证明框架能跑通一次,不证明你的数据进入系统后仍然可追踪,不证明检索结果能解释,不证明 Agent 的

时间:2026-07-13 14:05
Go语言AES混淆加密解密敏感数据详解

Go语言AES混淆加密解密敏感数据详解

Go语言AES加密需注意:密钥长度必须为16、24或32字节,否则会引发panic;CBC模式解密乱码常因IV或PKCS7填充错误;GCM模式中nonce不可重用,否则密钥可被恢复;ECB模式因明文块输出固定密文,存在安全风险,不建议使用。

时间:2026-07-13 06:53
C++ std::atomic::wait高性能轮询等待原子变量状态变化

C++ std::atomic::wait高性能轮询等待原子变量状态变化

C++20的std::atomic::wait是轻量级等待机制,需GCC11+ Clang12+及glibc≥2 34,macOS不支持。需与notify配对,注意内存序,循环检查防虚假唤醒。超时版本精度有限,高性能关键在notify时机与内存序正确性。

时间:2026-07-13 06:53
VSCode左侧边栏不见了?快速找回方法

VSCode左侧边栏不见了?快速找回方法

按Ctrl+B或Cmd+B可恢复被误触隐藏的侧边栏。若无效,需检查窗口焦点是否在编辑器、是否处于全屏或Zen模式、workbench activityBar visible配置项、扩展冲突以及远程环境同步问题,并逐一排查。

时间:2026-07-13 06:53
VSCode中利用Node批量修改多媒体文件元数据标签

VSCode中利用Node批量修改多媒体文件元数据标签

music-metadata库支持跨格式读写MP3、FLAC、M4A、WAV等音频元数据,需先用parseFile()初始化,再调用writeMetadata()写入。批量修改前必须验证写入支持,封面图片需为Uint8Array格式。在VSCode终端运行脚本比插件更可控,处理中文路径时需切换终端代码页为UTF-8并指定ID3v2 3版本以避免乱码。

时间:2026-07-13 06:53
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜