使用feign调用GET请求时使用实体对象参数

2023-11-11

在平时使用过程中,GET请求是可以直接使用实体参数的,但是当使用feign调用时,会报错。这时了解到使用feign调用时,如果是实体对象,会将参数写入body,而GET请求是不使用body的。这种情况应该怎么处理呢,我有三种办法:

1. 修改服务者。 

       既然get请求在使用feign的时候无法使用实体,那就修改为post/PUT请求,这样就能使用实体了。但是此种方法时,如果服务提供方使用的restful风格,只是查询数据,居然修改为post请求,这就不合理了。并且如果是跨部门的合作,去要求服务提供者修改,这就更加不现实了。

2. 修改传参格式。

      既然服务提供方无法去强制要求,那我们消费端只能修改传参条件。我们可以直接使用Map来传参,只需要加上注解就可以了。

@RequestParam Map param,简单实用。

3. 仍然传入实体对象。

     对于第二种方法,传入map可谓是一了百了,但是在实际过程中,应该很多公司都杜绝使用此种方式,map虽然写的简单,但是别人不能一目了然的了解这个map里有什么,换个人来看,就只知道各种map在传递,但是里面具体有什么值,会导致什么后果都无法进行判断,对比接口时也发现,feign的请求和服务提供者的请求不一致。因此,这样也是很多具有代码洁癖,追求代码优雅的人无法忍受的。那么,应该怎么传入实体呢。

     在上一篇https://blog.csdn.net/woyyazj/article/details/106283333使用springcloud feign时 token认证 其实已经提到了,我们可以使用增加拦截器的方式,来先处理我们的请求。既然实体对象不能传入body,那么我们能不能直接从body里获取出来,然后在放到参数里去呢?答案当然是肯定的。我们可以先查看RequestTemplate的源码,发现里面存在2个属性,对于我们来说比较重要

 

private final Map<String, QueryTemplate> queries = new LinkedHashMap<>();

 

private Request.Body body = Request.Body.empty();

我们要处理的也就是这2个参数,我们可以先从body里把我们的实体对象获取出来,然后再将参数存入queries,再清空body,这不就完成我们的目的了吗?

public Request.Body requestBody() {
  return this.body;
}
public RequestTemplate query(String name, String... values) {
  if (values == null) {
    return query(name, Collections.emptyList());
  }
  return query(name, Arrays.asList(values));
}

上面2个方法,就是分别取出body,和给queries加入参数的方法。然后找了一圈,未找到清理body的方法,怎么办.,反射啊,反射去修改不要太简单,很轻松就完成了,达到我们的目的。代码如下

import com.alibaba.fastjson.JSON;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class FeignConfig implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //添加token
        requestTemplate.header("Authorization", request.getHeader("Authorization"));
        //将body的数据写入参数
        if("GET".equals(requestTemplate.method())){
            try{
                //获取body内容
                String json = requestTemplate.requestBody().asString();
                if (StringUtils.isEmpty(json)) {
                    return ;
                }
                Map<String, Object> map= JSON.parseObject(json);
                Set<String> set = map.keySet();
                Iterator<String> it = set.iterator();
                while (it.hasNext()) {
                    String key = (String) it.next();
                    Object values = map.get(key);
                    if (values!=null && !"".equals(values) && !"null".equals(values)) {
                        //将body的参数写入queries
                        requestTemplate.query(key,values.toString());
                    }
                }
                Class requestClass=requestTemplate.getClass();
                Field field = requestClass.getDeclaredField("body");
                field.setAccessible(true);
                //修改body为空。
                field.set(requestTemplate, Request.Body.empty());
            }catch (Exception e){

            }


        }

    }
}

 

以上三种方法都介绍了,至于怎么选择,依据自身情况吧

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用feign调用GET请求时使用实体对象参数 的相关文章

随机推荐

  • 最常用的js混淆加密解

    JS混淆加密是一种用于保护JS代码的技术 它能够将代码变得难以理解和修改 从而提高代码的安全性 但是 当我们需要修改和维护这些代码时 我们就会面临困难 因此 在某些情况下 我们需要解这些JS代码 下面 我将给大家介绍一些JS混淆加密的常用技
  • C++ 插入排序法 stl实现

    insertsort cpp 此文件包含 main 函数 程序执行将在此处开始并结束 include pch h include
  • TcpSocket发送延时,Nagle算法

    1 Nagle算法 是为了减少广域网的小分组数目 从而减小网络拥塞的出现 该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组 在该分组ack到达之前不能发送其他的小分组 tcp需要收集这些少量的分组 并在ack到来时以一个分组
  • latex 字母加粗

    latex 中字母的常规表示 w w w w latex 中字母常规加粗 也就是不改变斜体 boldsymbol w w boldsymbol w w latex 中字
  • 操作系统基础总结

    问题 一 进程描述和控制 1 what 进程 2 what process trace 通过列出该进程的指令序列来描述单个进程的行为 这样的序列叫做进程轨迹 3 what dispathcer 分排器 作用是使一个进程切换到另一个进程 4
  • 前后端分离架构:Web实现前后端分离,前后端解耦

    一 前言 前后端分离 已经成为互联网项目开发的业界标杆 通过Tomcat Ngnix 也可以中间有个Node js 有效地进行解耦 并且前后端分离会为以后的大型分布式架构 弹性计算架构 微服务架构 多端化服务 多种客户端 例如 浏览器 车载
  • Zookeeper入门到精通02——zookeeper的本地安装操作

    2 zookeeper的本地安装操作 2 1 本地安装 下面操作在linux环境下完成 如果您的电脑没有虚拟机环境 可以参考VMware软件下载 含秘钥 zip 免费高速下载 百度网盘 分享无限制 baidu com 配置 这里我们部署三台
  • 引用vue-element-admin项目 npm ERR! code 128npm ERR! An unknown git error occurrednpm ERR! command git -

    报错 npm ERR code 128 npm ERR An unknown git error occurred npm ERR command git no replace objects ls remote ssh git githu
  • Flutter之路由管理(页面跳转)

    路由 核心是 路由映射表 如 名字detail映射到 DetailPage页面等 在Flutter中 路由管理主要有两个类 Route和Navigator Route 一个页面要想被路由统一管理 必须包装为一个Route Navigator
  • 使用GPT让你的RStudio如虎添翼

    API的的调用目前来说不限制地区 但是OpenAI的API的申请限制了地区 运行的时候 如果出现了429 意味着你被限流了 需要等一会才行 前提是 你需要注册一个OpenAI的账户 然后在https openai com api 里申请Op
  • nginx FastCGI错误Primary script unknown解决办法

    在centos上成功编译安装nginx 1 4 php 5 4并成功启动nginx和php fpm后 访问php提示 File not found 同时在错误日志中看到 复制代码代码如下 2013 10 22 20 05 49 error
  • Java的选择排序、冒泡排序、插入排序

    不爱生姜不吃醋 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始 不如现在行动 文章目录 前言 一 选择排序 1 原理 2 时间复杂度 3 代码实现 二 冒泡排序 1 原理 2 时间复杂度 3 代码实现 三 插入排序 1 原理 2 时
  • idea 历史版本下载地址

    防止忘记 特此记录 idea官网旧版本地址
  • 折半查找某数X在数组中出现的次数(2019北邮考研真题)

    题目 采用折半查找的思想 统计所给X在数组A中出现的次数 例如 122235 2出现次数为3 分析 采用分治 折半查找 的思想 若中间值为X 则统计数量 1 并递归查找左子表与右子表 若中间值小于X 则X可能在右子表 查找右子 表 若中间值
  • 2023年第十五届“中国电机工程学会杯”全国大学生电工数学建模竞赛题目 A题:电采暖负荷参与电力系统功率调节的技术经济分析

    A题 电采暖负荷参与电力系统功率调节的技术经济分析 建设以新能源为主体的新型电力系统是应对全球气候变化挑战的重要举措 高比例新能源接入导致电力系统调节能力稀缺 亟需开发新的调节资源 如火电深度调峰 建设抽水蓄能电站 配置储能和挖掘负荷中的调
  • STL之Set:Set的基本用法

    set集合容器实现了红黑树 Red Black Tree 的平衡二叉检索树的的数据结构 在插入元素时 它会自动调整二叉树的排列 把该元素放到适当的位置 以确保每个子树根节点的键值大于左子树所有节点的键值 而小于右子树所有节点的键值 另外 还
  • 【51nod】1381 硬币游戏

    硬币游戏 Link 解题思路 所有情况都可以平移为与平行线相切的情况 则期望为 2 n 2n 2n 若硬币上下都与平行线相切 那么期望为 2 n
  • Java根据身份证号计算年龄

    可以使用Java中的SimpleDateFormat类将身份证号中的出生日期解析为日期类型 然后使用ChronoUnit类计算出生日期和当前日期之间的时间差 最后除以365即可得到年龄 代码示例如下 String idCard xxxxxx
  • matlab不存在字段detials,matlab - MATLAB GUIDE错误:引用不存在的字段 - 堆栈内存溢出...

    在Matlab的GUIDE中 我试图在首次使用choice data button选中该文件的标题时动态更改带有该文件的标题的弹出菜单文本 但是 这给了我一个错误 即group variable popupmenu是一个不存在的字段 这篇文
  • 使用feign调用GET请求时使用实体对象参数

    在平时使用过程中 GET请求是可以直接使用实体参数的 但是当使用feign调用时 会报错 这时了解到使用feign调用时 如果是实体对象 会将参数写入body 而GET请求是不使用body的 这种情况应该怎么处理呢 我有三种办法 1 修改服