当前位置: 首页 > news >正文

Feign 调用为何POST不支持同时传入多个SpringQueryMap对象,但是GET方法就支持?

Feign 调用为何POST不支持同时传入多个SpringQueryMap对象,但是GET方法就支持?

    • 1.1 问题背景
    • 1.2 原因分析
    • 1.3 修复方案
      • 1.3.1 修复方案一 切换使用GET方法,可以试用多个`@SpringQueryMap`注解 (测试实际不行)
      • 1.3.2 修复方案二 使用POST方法并将两个参数合并后使用`@RequestBody`注解(未测试)
      • 1.3.3 修复方案二 使用POST方法并将两个参数合并后使用`@SpringQueryMap`注解(亲测可行)

1.1 问题背景

我们知道,在Feign接口中不支持@ModelAttribute 注解,可以试用@SpringQueryMap代替。

由于GET 请求参数的限制,因此,在某些情况会把查询接口使用POST方法。

但是当使用Feign接口调用POST方法,有多个对象参数的时候,如果这样使用会出现问题,第二个参数接受时候会为空。

/*** 异地查询日志服务*/
@FeignClient(name = "remoteCallElasticsearchService", url = "${query-current-service-provider.prevBaseUrl}")
public interface RemoteCallElasticsearchService {/*** 异地调用日志查询服务* @param elkLogQueryParam 日志查询请求参数* @param myPageParam 分页参数* @return 日志查询结果*/@PostMapping(value = "/rpc-service/queryRemoteElkLogInfoPageList.do")Page<ElkLogResponseVO> queryRemoteElkLogInfoPageList(@SpringQueryMap ElkLogQueryParam elkLogQueryParam,@SpringQueryMap MyPageParam myPageParam);
}

1.2 原因分析

Feign 调用为何POST不支持同时传入多个SpringQueryMap对象,但是GET方法就支持?

  • Feign是一个声明式的HTTP客户端库,通常用于调用RESTful服务。
  • 在Feign中,Spring Cloud的@FeignClient注解通常用于定义和配置需要调用的目标服务。
  • Feign的设计是基于HTTP方法和RESTful风格的,因此它在处理HTTP请求时遵循了RESTful的规范。
  • 在HTTP中,GET请求通常允许将多个查询参数附加到URL中,因此您可以轻松地使用多个@SpringQueryMap对象作为参数。这是因为GET请求的参数是直接附加到URL上的,没有请求体,所以它们可以并存。
  • 而POST请求通常用于发送复杂的数据,通常使用请求体来传递参数。
  • 因此,在Feign中,通过@RequestBody@RequestPart等注解,您可以将数据作为请求体传递给POST请求。
  • 但是,Feign的设计不直接支持将多个@SpringQueryMap对象传递给POST方法,因为POST请求通常不应该在请求体中包含大量查询参数,而应该将它们包含在请求体中,以进行更复杂的操作。
  • 如果您需要将多个参数传递给POST方法,通常的做法是将它们合并为一个对象,然后将该对象作为请求体发送,而不是使用多个@SpringQueryMap对象。
  • 这可以提高代码的可读性和维护性,并符合RESTful设计的最佳实践。
  • 要传递多个查询参数,可以将它们包装在一个对象中,然后将该对象作为请求体传递给POST方法。
  • 例如,您可以创建一个DTO(数据传输对象)来包含所有参数,然后将其传递给Feign的POST方法。
  • 在HTTP中,GET请求通常允许将多个查询参数附加到URL中,因此您可以轻松地使用多个@SpringQueryMap对象作为参数。这是因为GET请求的参数是直接附加到URL上的,没有请求体,所以它们可以并存。
  • Feign的设计不直接支持将多个@SpringQueryMap对象传递给POST方法,因为POST请求通常不应该在请求体中包含大量查询参数,而应该将它们包含在请求体RquestBody中,以进行更复杂的操作。

1.3 修复方案

1.3.1 修复方案一 切换使用GET方法,可以试用多个@SpringQueryMap注解 (测试实际不行)

  • 支持,两个参数都可以正确获取到
/*** 异地查询日志服务*/
@FeignClient(name = "remoteCallElasticsearchService", url = "${query-current-service-provider.prevBaseUrl}")
public interface RemoteCallElasticsearchService {/*** 异地调用日志查询服务* @param elkLogQueryParam 日志查询请求参数* @param myPageParam 分页参数* @return 日志查询结果*/@GetMapping(value = "/rpc-service/queryRemoteElkLogInfoPageList.do")Page<ElkLogResponseVO> queryRemoteElkLogInfoPageList(@SpringQueryMap ElkLogQueryParam elkLogQueryParam,@SpringQueryMap MyPageParam myPageParam);
}

1.3.2 修复方案二 使用POST方法并将两个参数合并后使用@RequestBody注解(未测试)

/*** 异地查询日志服务*/
@FeignClient(name = "remoteCallElasticsearchService", url = "${query-current-service-provider.prevBaseUrl}")
public interface RemoteCallElasticsearchService {/*** 异地调用日志查询服务* @param elkLogQueryParam 日志查询请求参数* @param myPageParam 分页参数* @return 日志查询结果*/@PostMapping(value = "/rpc-service/queryRemoteElkLogInfoPageList.do")Page<ElkLogResponseVO> queryRemoteElkLogInfoPageList(@RequestBody ElkLogQueryWithPageParam elkLogQueryWithPageParam ,);
}

1.3.3 修复方案二 使用POST方法并将两个参数合并后使用@SpringQueryMap注解(亲测可行)

/*** 异地查询日志服务*/
@FeignClient(name = "remoteCallElasticsearchService", url = "${query-current-service-provider.prevBaseUrl}")
public interface RemoteCallElasticsearchService {/*** 异地调用日志查询服务* @param elkLogQueryParam 日志查询请求参数* @param myPageParam 分页参数* @return 日志查询结果*/@PostMapping(value = "/rpc-service/queryRemoteElkLogInfoPageList.do")Page<ElkLogResponseVO> queryRemoteElkLogInfoPageList(@SpringQueryMap ElkLogQueryWithPageParam elkLogQueryWithPageParam ,);
}

相关文章:

Feign 调用为何POST不支持同时传入多个SpringQueryMap对象,但是GET方法就支持?

Feign 调用为何POST不支持同时传入多个SpringQueryMap对象&#xff0c;但是GET方法就支持&#xff1f; 1.1 问题背景1.2 原因分析1.3 修复方案1.3.1 修复方案一 切换使用GET方法&#xff0c;可以试用多个SpringQueryMap注解 &#xff08;测试实际不行&#xff09;1.3.2 修复方案…...

RISC-V 特权级架构

特权级别 级别的数值越大&#xff0c;特权级越高&#xff0c;掌控硬件的能力越强&#xff0c;在CPU硬件层面&#xff0c;M模式必须存在&#xff0c;其它模式可以不存在 执行环境调用 ecall &#xff0c;这是一种很特殊的陷入类的指令&#xff0c; 相邻两特权级软件之间的接口正…...

目录启示:PHP 与命名空间的声明

文章目录 参考环境命名空间概念版本支持影响范围 全局命名空间概念魔术常量 \_\_NAMESPACE\_\_声明全局命名空间 声明命名空间为空间命名命名规则核心命名空间 子命名空间的声明在同一文件中定义多个命名空间无括号命名空间声明有括号命名空间声明禁止混合使用推荐使用有括号命…...

D. Divide and Equalize--Codeforces Round 903 (Div. 3)

D. Divide and Equalize 题意&#xff1a;让一组数中的一个数除以一个因子&#xff0c;一个数除以一个因子&#xff0c;假如经过若干次操作后能够使数组所有数相等&#xff0c;那么输出YES&#xff0c;否则输出NO。 分析&#xff1a;乘除因子&#xff0c;那么实际上就是因子的…...

保姆式教程:MAC安装Android studio(包括安装JDK,Android SDK),解决gradle下载慢的问题

文章目录 参考文章安装JDK并配置环境变量安装JDK配置JDK相关的环境变量 Android studio 安装下载Android studiogradle下载慢解决方法 安装Android SDK选择jdk版本安装SDK并配置环境变量 参考文章 原文链接 原文链接 安装JDK并配置环境变量 安装JDK 下载地址 下载后双击安装…...

Ps:选区的布尔运算

选区的布尔 Boolean运算指的是选区之间的相加&#xff08;并集&#xff09;、相减&#xff08;差集&#xff09;以及相交&#xff08;交集&#xff09;&#xff0c;从而形成一个新的选区。 ◆ ◆ ◆ 使用工具选项栏 在 Ps 中&#xff0c;几乎所有的选区工具的工具选项栏上都有…...

PyTorch 深度学习之卷积神经网络(基础篇)Basic CNN(九)

0. Revision: Fully connected Neural Network 全连接 1. Convolution Neural Network 保留空间信息 1.1 Convolution Convolution-Single Input Channel 单通道 数乘 3 input Channels 3通道 N input Channels N input Channels and M output channel M 个卷积核 1.2 conv…...

torch实现Gated PixelCNN

文章目录 PixelCNNGated PixelCNN PixelCNN import torch import torch.nn as nn import torch.nn.functional as F# Pixel CNNclass MaskConv2d(nn.Module):def __init__(self, conv_type, *args, **kwags):super().__init__()assert conv_type in (A, B)self.conv nn.Conv2…...

破局「二次创业」:合思的新解法

在新的水温下&#xff0c;寻找更为良性的发展正在成为企业的必答题。对此&#xff0c;合思给出的不仅是一份更“省”的答题方法。也更是从认知层到行动层&#xff0c;最后到工具层的一张授人以渔的“渔网”。 作者|思杭 编辑|皮爷 出品|产业家 今年4月初&#xff0c;广州…...

第五章:TCP和UDP基本原理

TCP和UDP基本原理 一、TCP/IP传输层的作用二、 端口1.范围2. 服务端3. 客户端4. 常见知名端口号4.1 TCP 80 HTTP4.2 TCP 20 21 FTP4.3 TCP 23 TELNET4.4 TCP 25 SMTP4.5 UDP 53 DNS4.6 TCP 443 HTTPS 三、 TCP原理1. TCP头部封装格式1.1 Source Port 源端口1.2 Destination Por…...

算法:动态规划的入门理解

文章目录 算法原理题目解析第n个泰波那契数列三步问题使用最小花费爬楼梯 从本篇开始总结的是动态规划的一些内容&#xff0c;动态规划是算法中非常重要的一个版块&#xff0c;因此也是学习算法中的一个重点&#xff0c;在学习动态规划前应当要把动态规划的基础知识学习一下 算…...

最新版nacos 2.2.3服务注册与发现版本依赖问题

最新版nacos的注册服务时配置文件写的是对的&#xff0c;但就是在nacos web页面无法看见服务&#xff0c;此时你需要注意你的依赖是否正确 spring: application:name: orderservicecloud:nacos:discovery:server-addr: 122.51.115.127:8848父工程依赖&#xff1a;现在最新的s…...

2023年中国合同能源管理行业研究报告

第一章 行业概况 1.1 定义及分类 合同能源管理 (Energy Performance Contracting, EPC) 是当前能源行业中一个重要的概念&#xff0c;它构建了一个桥梁&#xff0c;将节能服务公司 (Energy Management Company, EMCo) 与用能单位紧密联系在一起。通过特定的契约形式&#xff…...

php以半小时为单位,输出指定的时间范围

//可预订小时范围$hour [];for ($i$startHour*3600;$i<$endHour*3600;$i1800){//以半小时为单位输出$startHourItem date(H:i,strtotime(date(Y-m-d))$i);//小时开始$endHourItem date(H:i,strtotime(date(Y-m-d))$i1800);//当前时间再加半小时$hourItemStr $startHourI…...

Electron应用的 asar 打包 解压

前言&#xff1a; .asar文件是一种归档文件格式&#xff0c;通常用于封装Electron应用程序的资源。Electron是一个使得开发者能够使用Web技术构建跨平台桌面应用程序的框架。为了提高性能和简化部署&#xff0c;Electron应用程序的资源通常会被打包到一个.asar文件中。 安装 as…...

蓝桥等考Python组别十七级003

第一部分:选择题 1、Python L17 (15分) 运行下面程序,输出的结果是( )。 def func(x, y): return (x + y) // 3 print(func(7, 5)) 2468正确答案:B 2、Python L17 (15</...

Redis概述和与SpringBoot的整合

Redis是一种高性能的键值对存储数据库&#xff0c;它支持多种数据结构&#xff0c;包括字符串、哈希、列表、集合和有序集合等。Redis具有快速、可靠、灵活和可扩展等特点&#xff0c;也被广泛应用于缓存、队列和排行榜等场景。 SpringBoot是一种基于Spring框架的快速开发脚手…...

Python 中的 round() 函数:实现精确的数值舍入操作

round(x, n) 函数用于对数值 x 进行舍入操作&#xff0c;并指定保留的小数位数为 n。它的工作原理如下&#xff1a; 如果 x 的小数位数小于等于 n&#xff0c;则直接返回 x 本身。例如&#xff0c;round(3.1415, 2) 将返回 3.14。 如果 x 的小数位数大于 n&#xff0c;则按照四…...

在springboot中如何开启Bean数据校验

①&#xff1a;添加JSR303规范坐标与Hibernate校验框架对应坐标 <dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId> </dependency><dependency><groupId>org.hibernate.validator<…...

【C语言好题系列三】

文章目录 学习导航一. 选择题二. 编程题(力扣/牛客网&#xff09;三. 总结 学习导航 一. 选择题 如下程序的运行结果是&#xff08;D&#xff09; char c[5]{a, b, \0, c, \0}; printf("%s", c);A: ‘a’ ‘b’ B: ab\0c\0 C: ab c D: ab 答案解析&#xff1a; 正…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...