当前位置: 首页 > 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; 正…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...