千家信息网

如何解决Feign调用的GET参数传递的问题

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了如何解决Feign调用的GET参数传递的问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何解决Feign调用的GET参数传递的问题文章都会有所收获,
千家信息网最后更新 2026年11月03日如何解决Feign调用的GET参数传递的问题

这篇文章主要介绍了如何解决Feign调用的GET参数传递的问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何解决Feign调用的GET参数传递的问题文章都会有所收获,下面我们一起来看看吧。

需求

在消费方服务通过GET方式,访问服务提供方的接口,需要传递多参数,拆分成多个参数的方式访问,不太适合用在该场景,需要改造成合适的方式调用服务方的接口

思考

拆分成多个参数时,若GET请求的参数超过3个及以上时,便不适用该种方式请求服务,因为这样传递参数过于臃肿,可读性也比较差;

若改造成POST请求的方式,虽然解决参数过多的问题,但是也带来了其他的开销,参数被放到了body里面,然后请求到服务方提供的接口,服务方的接口也改造成了POST方式,改变了原来的GET方式调用的初衷,不太友好;

可以在消费方调用Feign接口时,参数封装到body中,在组装Feign接口请求时,将body里面的参数取出来,转换为GET方式请求的参数,请求body的参数,然后发起请求,实现了GET方式访问服务方提供的接口;

以下是这三种调用方式的具体实现,可以根据适合自己的业务场景去使用,选择不同的方式请求调用:

GET方式请求①

请求DTO对象:

package com.springcloud.pojo; import java.util.Date;  public class Requets01DTO {     private Date startTime;     private Date endTime;     private String message;     @Override    public String toString() {        return "Requets01DTO{" +                "startTime=" + startTime +                ", endTime=" + endTime +                ", message='" + message + '\'' +                '}';    }     public Date getStartTime() {        return startTime;    }     public void setStartTime(Date startTime) {        this.startTime = startTime;    }     public Date getEndTime() {        return endTime;    }     public void setEndTime(Date endTime) {        this.endTime = endTime;    }     public String getMessage() {        return message;    }     public void setMessage(String message) {        this.message = message;    }}

消费方的请求:

    @Autowired    GetClient01 getClient01;     @GetMapping("/request/get/01")    public String requestGetOne(Requets01DTO requets01DTO) {        return getClient01.queryDataByGetRequest(requets01DTO.getStartTime(), requets01DTO.getEndTime(), requets01DTO.getMessage());    }

Feign接口:

package com.springcloud.service; import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam; import java.util.Date; @FeignClient(value = "provider-8762", contextId = "GetClient01")public interface GetClient01 {     /**     * GET方式请求①     *     * @param startTime     * @param endTime     * @param message     * @return     */    @GetMapping("/get/01")    String queryDataByGetRequest(@RequestParam("startTime") Date startTime, @RequestParam("endTime") Date endTime,                                 @RequestParam("message") String message);}

服务提供方:

@RestControllerpublic class RequestProviderController {     @GetMapping("/get/01")    public String queryDataByGetRequest(@RequestParam("startTime") Date startTime, @RequestParam("endTime") Date endTime,                                        @RequestParam("message") String message) {        Requets01DTO requets01DTO = new Requets01DTO();        requets01DTO.setStartTime(startTime);        requets01DTO.setEndTime(endTime);        requets01DTO.setMessage(message);        return requets01DTO.toString();    }}

请求结果截图:

GET方式请求②

Feign调用的请求改为POST方式

消费方的请求:

    @Autowired    GetClient02 getClient02;     @GetMapping("/request/get/02")    public String requestGetTwo(Requets01DTO requets01DTO) {        return getClient02.queryDataByGetRequest(requets01DTO);    }

Feign接口:

package com.springcloud.service; import com.springcloud.pojo.Requets01DTO;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.PostMapping; @FeignClient(value = "provider-8762", contextId = "GetClient02")public interface GetClient02 {      /**     * GET方式请求②(Feign调用的请求改为POST方式)     *     * @param requets01DTO     * @return     */    @PostMapping("/post/02")    String queryDataByGetRequest(Requets01DTO requets01DTO);}

服务提供方:

    @PostMapping("/post/02")    public String queryDataByGetRequest(@RequestBody Requets01DTO requets01DTO) {        return requets01DTO.toString();    }

请求结果截图:

GET方式请求③

组装Feign接口请求时,将body里面的参数取出来,转换为GET方式请求的参数

添加Feign请求的配置类:

package com.springcloud.config; import com.alibaba.fastjson.JSON;import feign.Request;import feign.RequestInterceptor;import feign.RequestTemplate;import org.springframework.context.annotation.Configuration;import org.springframework.http.HttpMethod;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.*; @Configurationpublic class FeignConfiguration implements RequestInterceptor {     @Override    public void apply(RequestTemplate requestTemplate) {        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();        HttpServletRequest request = attributes.getRequest();         //填充get中的body数据转化成query数据        if (requestTemplate.method().equals(HttpMethod.GET.name()) && Objects.nonNull(requestTemplate.body())) {            String json = requestTemplate.requestBody().asString();            Map map = JSON.parseObject(json);            Set set = map.keySet();            Iterator it = set.iterator();            while (it.hasNext()) {                String key = it.next();                Object values = map.get(key);                if (Objects.nonNull(values)) {                    // 将body的参数写入queries                    requestTemplate.query(key, values.toString());                }            }             try{                Class requestClass = requestTemplate.getClass();                Field field = requestClass.getDeclaredField("body");                field.setAccessible(true);                //修改body为空。                field.set(requestTemplate, Request.Body.empty());            } catch (Exception ex) {                System.out.println(ex.fillInStackTrace());            }         }         Enumeration headerNames = request.getHeaderNames();        if (headerNames != null) {            while (headerNames.hasMoreElements()) {                String name = headerNames.nextElement();                String values = request.getHeader(name);                // 跳过 content-length                if (name.equals("content-length")){                    continue;                }                requestTemplate.header(name, values);            }        } else {            System.out.println(String.format("feign interceptor error header:%s", requestTemplate));        }    }}

添加fastJson的maven依赖:

                    com.alibaba            fastjson            1.2.74        

消费方的请求:

    @Autowired    GetClient03 getClient03;     @GetMapping("/request/get/03")    public String requestGetThree(Requets01DTO requets01DTO) {        return getClient03.queryDataByGetRequest(requets01DTO);    }

Feign接口:

package com.springcloud.service; import com.springcloud.config.FeignConfiguration;import com.springcloud.pojo.Requets01DTO;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.GetMapping; @FeignClient(value = "provider-8762", contextId = "GetClient03", configuration = FeignConfiguration.class)public interface GetClient03 {     /**     * GET方式请求③(组装Feign接口请求时,将body里面的参数取出来,转换为GET方式请求的参数)     *     * @param requets01DTO     * @return     */    @GetMapping("/get/03")    String queryDataByGetRequest(Requets01DTO requets01DTO);}

服务提供方:

    @GetMapping("/get/03")    public String queryDataByGetRequest03(Requets01DTO requets01DTO) {        return requets01DTO.toString();    }

请求结果截图:

Feign调用传递的GET参数日期,要指定jsonFormat注解,body转GET参数时,日期参数会变为字符串,需要指定日期格式

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")    private Date startTime;     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")    private Date endTime;

**结果截图:**

关于"如何解决Feign调用的GET参数传递的问题"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"如何解决Feign调用的GET参数传递的问题"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

参数 方式 接口 服务 问题 消费 供方 截图 结果 日期 知识 改造 内容 多个 数据 篇文章 不同 合适 臃肿 业务 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡 蓝思科技飞鸽互联网 互联网巨头反垄断金融科技 互联网与科技发展 科技制造互联网公司 金融科技 互联网金融 凡科互联网科技 国外互联网科技网站 恒生科技互联网指数分析 哈尔滨秒房互联网科技有限公司 老年人脱离互联网科技的作文 宁夏众和广鑫互联网科技有限公司 岳阳华臻互联网科技有限公司 广州市恰铎互联网科技有限公司 世界互联网领先科技成果获奖 区块链结合互联网科技 沐思想互联网科技有限公司 云鲸互联网络科技有限公司 互联网科技创新创业项目 每日互联网科技新闻 山东特亿宝互联网科技有限公司 美国互联网科技巨头监管 互联网 的科技创新 万易互联网科技有限公司 互联网金融 科技创新 互联网科技大会案例 互联网科技创新服务 锡山区互联网智能科技产品供应 山东星卡互联网科技有限公司官网 前海云享互联网科技
0