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 ,);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/104793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++陷阱——变量名和函数名的冲突问题

C语言/C陷阱——变量名和函数名的冲突问题 先来看这两串代码&#xff1a; 代码一&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 1;int main() {printf("%d\n", rand);return 0; }代码二&#xff1a; #include <stdio.h> #inc…

C++ 线程安全注解

实例开篇 线程安全注解是现代C开发的机制&#xff0c;通常在编译期可以帮助发现一些线程安全问题。 下面直接从实例中来理解。 class Account { private:Mutex mu;int money GUARDED_BY(mu);void Sub(int amount) {money - amount; // writing variable money requires h…

基于php+thinkphp+vue的校园二手交易网站

运行环境 开发语言&#xff1a;PHP 数据库:MYSQL数据库 应用服务:apache服务器 使用框架:ThinkPHPvue 开发工具:VScode/Dreamweaver/PhpStorm等均可 项目简介 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发…

43.241.18.123哪些问题会导致服务器里面时间错误

我们在使用服务器的过程中&#xff0c;有时候可能会发现&#xff0c;服务器里面时间跟标准的时间对不上&#xff0c;那服务器里面时间错误可能由哪些问题引起&#xff1a; 硬件问题&#xff1a;服务器硬件中的时钟或电池可能损坏或失效&#xff0c;导致时间不准确或重置为默认…

2024年计算机专业Java选题推荐✅(最新、最全、最容易通过的选择)

文章目录 前言选题和具体实现详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#x…

【LeetCode刷题(数据结构)】:对称二叉树

给你一个二叉树的根节点 root 检查它是否轴对称 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xff1a; 树中节点数目在范围 [1, 1000] 内 -100 < Node.val < 100 对称二叉…

Aviator表达式引擎

一、快速介绍 &#xff08;一&#xff09;Aviator Aviator是一个用于动态表达式求值的高性能、轻量级Java引擎。以下是一些关于Aviator引擎的重要特点和设计目标&#xff1a; 轻量级和高性能&#xff1a; Aviator的设计目标之一是轻量级和高性能。它的大小很小&#xff0c;加…

PyQt中线程和线程信号的使用

PyQt中的线程和线程信号是用于在应用程序中实现多线程编程的重要概念。线程允许你在应用程序中同时执行多个任务&#xff0c;而线程信号用于在不同线程之间进行通信和协调。以下是关于PyQt中线程和线程信号的简要解释&#xff1a; 线程&#xff1a; 线程是应用程序中的并发执行…

@Component 和 @Bean的区别

Component 和 Bean 是Spring框架中用于管理和配置依赖注入的关键注解&#xff0c;用于定义和管理Spring应用程序中的组件。 Component: Component 是一种泛用型的Spring注解&#xff0c;用于标识一个类为Spring组件。Spring会自动扫描所有带有Component 注解的类&#xff0c;并…

介绍一下mysql有哪些索引类型

以下是MySQL的8种不同索引类型的比较&#xff0c;以帮助你了解它们的特点和适用场景&#xff1a; 索引类型用途和特点适用场景B-Tree 索引用于范围查询、等值查找和排序操作大多数查询 &#xff0c;不适合全文搜索和空间数据。唯一索引保证索引列的值唯一&#xff0c;不允许重…

PTA程序辅助设计平台—2023年软件设计综合实践_4(数组及字符串)

6-1 找最小元素/选择排序 - C/C 数组及字符串 &#xff08;找最小元素&#xff09;对于给定的包含10个元素的整数数组&#xff0c;设计一个函数&#xff0c;从数组给定的下标范围[i,j]里找到值最小的元素&#xff0c;返回其下标。该函数的原型可以是int findMin(int a[], int …

【Redis】Java客户端使用list命令

lpush/lrange rpush/rpop/lpop blpop/brpop llen

mac使⽤nginx

⽅法1&#xff1a;homebrew 默认本地已经安装homebrew&#xff1b; 安装与启动 brew install nginx 安装nginx&#xff1b; brew services start nginx 启动nginx nginx⽂件⽬录 1. nginx安装⽂件⽬录/usr/local/Cellar/nginx 2. nginx配置⽂件⽬录/usr/local/etc/nginx 3. con…

Windows 多媒体编程库 DirectX 介绍

目录 1、什么是DirectX&#xff1f; 2、使用DirectX的好处 2.1、DirectX为软件开发者提供硬件无关性 2.2、为硬件开发提供策略 3、DirectX的主体构成 3.1、Direct3D 3.2、DirectDraw 3.3、DirectPlay 3.4、DirectSound 3.5、DirectMusic 3.6、DirectInput 4、Dire…

谈谈多线程与多线程同步

一、线程展开说说 二、走近多线程同步

uniapp快速入门系列(4)- 微信小程序开发

第四章 微信小程序开发 4.1 微信小程序开发与uniapp的融合4.2 微信小程序API在uniapp中的使用4.3 微信小程序常见问题的解决方法问题1: 如何获取用户信息&#xff1f;问题2: 如何获取当前位置&#xff1f;问题3: 如何发送网络请求&#xff1f; 在本章中&#xff0c;我们将学习如…

缓存降级代码结构设计

缓存降级设计思想 接前文缺陷点 本地探针应该增加计数器&#xff0c;多次异常再设置&#xff0c;避免网络波动造成误判。耦合度过高&#xff0c;远端缓存和本地缓存应该平行关系被设计为上下游关系了。公用的远端缓存的操作方法应该私有化&#xff0c;避免集成方代码误操作&…

lvgl 界面管理器

lv_scr_mgr lvgl 界面管理器 适配 lvgl 8.3 降低界面之间的耦合使用较小的内存&#xff0c;界面切换后会自动释放内存内存泄漏检测 使用方法 在lv_scr_mgr_port.h 中创建一个枚举&#xff0c;用于界面ID为每个界面创建一个页面管理器句柄将界面句柄添加到 lv_scr_mgr_por…

机器学习基础之《回归与聚类算法(2)—欠拟合与过拟合》

一、背景 1、上一篇说正规方程的时候&#xff0c;实际情况中使用很少&#xff0c;主要原因它不能解决过拟合。 2、训练集上表现的好&#xff0c;测试集上表现不好—过拟合 二、欠拟合和过拟合 1、欠拟合 训练集&#xff1a;有3个训练集&#xff0c;告诉机器都是天鹅 机器学…

Docker 构建Python镜像时,pip使用国内地址的dockerfile模版

一、问题现象 构建镜像时&#xff0c;使用pip命令打包报错&#xff1a; 二、问题根因 因国内无法访问pip的配置文件中的仓库地址 三、解决办法 这个办法同样适用于&#xff1a;物理机&#xff0c;这个地址是阿里云的 pip config set global.index-url http://mirrors.aliy…