广告
返回顶部
首页 > 资讯 > 精选 >如何解决Feign调用的GET参数传递的问题
  • 956
分享到

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

2023-06-29 09:06:54 956人浏览 泡泡鱼
摘要

这篇文章主要介绍了如何解决Feign调用的GET参数传递的问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何解决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 {         @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();    }}

请求结果截图:

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

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 {          @PostMapping("/post/02")    String queryDataByGetRequest(Requets01DTO requets01DTO);}

服务提供方:

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

请求结果截图:

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

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<String, Object> map = JSON.parseObject(json);            Set<String> set = map.keySet();            Iterator<String> 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<String> 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依赖:

<!-- JSON 解析器和生成器 -->        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastjson</artifactId>            <version>1.2.74</version>        </dependency>

消费方的请求:

    @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 {         @GetMapping("/get/03")    String queryDataByGetRequest(Requets01DTO requets01DTO);}

服务提供方:

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

请求结果截图:

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

 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参数传递的问题”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“如何解决Feign调用的GET参数传递的问题”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何解决Feign调用的GET参数传递的问题

本文链接: https://www.lsjlt.com/news/323984.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解决Feign调用的GET参数传递的问题
    目录需求思考GET方式请求①GET方式请求②GET方式请求③需求 ​ 在消费方服务通过GET方式,访问服务提供方的接口,需要传递多参数,拆分成多个参数的方式访问,不太适合用在该场景,...
    99+
    2022-11-13
  • 如何解决Feign调用的GET参数传递的问题
    这篇文章主要介绍了如何解决Feign调用的GET参数传递的问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何解决Feign调用的GET参数传递的问题文章都会有所收获,下面我们一起来看看吧。需求在消费方服务通...
    99+
    2023-06-29
  • 如何解决使用feign传递参数类型为MultipartFile的问题
    这篇文章主要介绍如何解决使用feign传递参数类型为MultipartFile的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!feign传递参数类型为MultipartFilefeign默认是不支持多媒体文件类型...
    99+
    2023-06-29
  • 关于feign调用的参数传递问题(@RequestBody和@RequestParam)
    目录feign调用的参数传递问题错误写法正确写法body的正确形式feign传参总结返回实体对象 服务提供者 restful传参 服务提供者传实体对象 服务提供者feign...
    99+
    2022-11-13
  • 解决SpringCloud Feign异步调用传参问题
    背景 各个子系统之间通过feign调用,每个服务提供方需要验证每个请求header里的token。 public void invokeFeign() throws Exceptio...
    99+
    2022-11-13
  • 解决SpringCloud Feign传对象参数调用失败的问题
    SpringCloud Feign传对象参数调用失败 不支持GET请求方式 使用Apache HttpClient替换Feign原生httpclient @...
    99+
    2022-11-12
  • feign传参MultipartFile问题如何解决
    本篇内容介绍了“feign传参MultipartFile问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!feign传参Multip...
    99+
    2023-06-29
  • bat传递参数调用问题解决记录
    目录bat 传递参数1.问题描述:Syntax 1:Syntax 2:Syntax 3:2.问题描述:解决:bat 传递参数 调用bat时,传递参数有个小问题,记录一下。 1.问题描...
    99+
    2023-05-19
    bat 传递参数 bat 传参调用
  • 使用feign传递参数类型为MultipartFile的问题
    目录feign传递参数类型为MultipartFile引入maven依赖加入配置类在feign客户端进行配置feign传参MultipartFile问题解决首先引入依赖新建feign...
    99+
    2022-11-13
  • SpringBoot如何通过Feign调用传递Header中参数
    目录【SpringBoot】通过Feign调用传递Header中参数如何通过Feign传递Header参数问题描述解决方案【SpringBoot】通过Feign调用传递Header中...
    99+
    2023-05-17
    SpringBoot Feign调用传递Header参数 SpringBoot Feign调用参数
  • 如何解决feign调用中文参数被encode编译的问题
    这篇文章主要介绍如何解决feign调用中文参数被encode编译的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Feign调用中文参数被encode编译原因在实现一个feign调用时使用了Post请求,并且拼接u...
    99+
    2023-06-29
  • 如何解决使用@PathVariable传递参数报错404的问题
    这篇文章给大家分享的是有关如何解决使用@PathVariable传递参数报错404的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目录@PathVariable传递参数报错404restFul风格传参, 参数...
    99+
    2023-06-25
  • feign之间传递oauth2 token的问题及解决方案
    目录feign之间传递oauth2token问题授权服务资源项目里获取当前用户oauth2feign报401的错误解决方法feign之间传递oauth2 token问题 在微服务架构...
    99+
    2022-11-13
  • python调用c++动态库dll时的参数传递问题怎么解决
    本篇内容介绍了“python调用c++动态库dll时的参数传递问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!stringC++生...
    99+
    2023-06-29
  • Feign如何解决服务之间调用传递token
    目录解决服务之间调用传递tokenFeign有提供一个接口RequestInterceptor调用方式Feign调用服务各种坑处理编写被调用服务编写调用api编写客户端服务解决服务之...
    99+
    2022-11-13
  • 使用feign调用接口时调不到get方法的问题及解决
    目录feign调用接口调不到get方法feign调用拿不到数据feign调用接口调不到get方法 记录今天在使用springcloud的feign调用接口时踩的坑。 调用的方法是ge...
    99+
    2022-11-13
  • 如何解决php传递页面参数乱码问题
    本文操作环境:Windows7系统,PHP7.4版,Dell G3电脑。如何解决php传递页面参数乱码问题?php get传值 中文参数 乱码问题的尝试解决:网站的中文参数是直接传的 例如 /index.phpt=你好所有页面均为utf-8...
    99+
    2015-06-19
    php
  • SpringCloud 如何使用feign时的复杂参数传递
    Feign传参注意 最近在用SpringCloud尝试重构以前的项目,使用Feign客户端组件来调用微服务,经常出现参数传不过去变成null的问题,网上查了一下发现feign在参数上...
    99+
    2022-11-12
  • 如何解决SpringCloud Feign传输Date类型参数存在误差的问题
    这篇文章将为大家详细讲解有关如何解决SpringCloud Feign传输Date类型参数存在误差的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Feign传输Date类型参数存在误差最近在...
    99+
    2023-06-29
  • SpringCloud Feign多参数传递的方法及需要注意哪些问题
    本文小编为大家详细介绍“SpringCloud Feign多参数传递的方法及需要注意哪些问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringCloud Feign多参数传递的方法及需要注意哪些问题”文章能帮助...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作