最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決Feign調(diào)用的GET參數(shù)傳遞的問(wèn)題

 更新時(shí)間:2022年03月04日 14:32:41   作者:java_life_style  
這篇文章主要介紹了解決Feign調(diào)用的GET參數(shù)傳遞的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

需求

? 在消費(fèi)方服務(wù)通過(guò)GET方式,訪問(wèn)服務(wù)提供方的接口,需要傳遞多參數(shù),拆分成多個(gè)參數(shù)的方式訪問(wèn),不太適合用在該場(chǎng)景,需要改造成合適的方式調(diào)用服務(wù)方的接口

思考

拆分成多個(gè)參數(shù)時(shí),若GET請(qǐng)求的參數(shù)超過(guò)3個(gè)及以上時(shí),便不適用該種方式請(qǐng)求服務(wù),因?yàn)檫@樣傳遞參數(shù)過(guò)于臃腫,可讀性也比較差;

若改造成POST請(qǐng)求的方式,雖然解決參數(shù)過(guò)多的問(wèn)題,但是也帶來(lái)了其他的開銷,參數(shù)被放到了body里面,然后請(qǐng)求到服務(wù)方提供的接口,服務(wù)方的接口也改造成了POST方式,改變了原來(lái)的GET方式調(diào)用的初衷,不太友好;

? 可以在消費(fèi)方調(diào)用Feign接口時(shí),參數(shù)封裝到body中,在組裝Feign接口請(qǐng)求時(shí),將body里面的參數(shù)取出來(lái),轉(zhuǎn)換為GET方式請(qǐng)求的參數(shù),請(qǐng)求body的參數(shù),然后發(fā)起請(qǐng)求,實(shí)現(xiàn)了GET方式訪問(wèn)服務(wù)方提供的接口;

以下是這三種調(diào)用方式的具體實(shí)現(xiàn),可以根據(jù)適合自己的業(yè)務(wù)場(chǎng)景去使用,選擇不同的方式請(qǐng)求調(diào)用:

GET方式請(qǐng)求①

請(qǐng)求DTO對(duì)象:

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;
? ? }
}

消費(fèi)方的請(qǐng)求:

? ? @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方式請(qǐng)求①
? ? ?*
? ? ?* @param startTime
? ? ?* @param endTime
? ? ?* @param message
? ? ?* @return
? ? ?*/
? ? @GetMapping("/get/01")
? ? String queryDataByGetRequest(@RequestParam("startTime") Date startTime, @RequestParam("endTime") Date endTime,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@RequestParam("message") String message);
}

服務(wù)提供方:

@RestController
public 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();
? ? }
}

請(qǐng)求結(jié)果截圖:

GET方式請(qǐng)求②

Feign調(diào)用的請(qǐng)求改為POST方式

消費(fèi)方的請(qǐng)求:

? ? @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方式請(qǐng)求②(Feign調(diào)用的請(qǐng)求改為POST方式)
? ? ?*
? ? ?* @param requets01DTO
? ? ?* @return
? ? ?*/
? ? @PostMapping("/post/02")
? ? String queryDataByGetRequest(Requets01DTO requets01DTO);
}

服務(wù)提供方:

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

請(qǐng)求結(jié)果截圖:

GET方式請(qǐng)求③

組裝Feign接口請(qǐng)求時(shí),將body里面的參數(shù)取出來(lái),轉(zhuǎn)換為GET方式請(qǐng)求的參數(shù)

添加Feign請(qǐng)求的配置類:

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.*;
?
@Configuration
public class FeignConfiguration implements RequestInterceptor {
?
? ? @Override
? ? public void apply(RequestTemplate requestTemplate) {
? ? ? ? ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
? ? ? ? HttpServletRequest request = attributes.getRequest();
?
? ? ? ? //填充get中的body數(shù)據(jù)轉(zhuǎn)化成query數(shù)據(jù)
? ? ? ? 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的參數(shù)寫入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);
? ? ? ? ? ? ? ? // 跳過(guò) 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>

消費(fèi)方的請(qǐng)求:

? ? @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方式請(qǐng)求③(組裝Feign接口請(qǐng)求時(shí),將body里面的參數(shù)取出來(lái),轉(zhuǎn)換為GET方式請(qǐng)求的參數(shù))
? ? ?*
? ? ?* @param requets01DTO
? ? ?* @return
? ? ?*/
? ? @GetMapping("/get/03")
? ? String queryDataByGetRequest(Requets01DTO requets01DTO);
}

服務(wù)提供方:

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

請(qǐng)求結(jié)果截圖:

 Feign調(diào)用傳遞的GET參數(shù)日期,要指定jsonFormat注解,body轉(zhuǎn)GET參數(shù)時(shí),日期參數(shù)會(huì)變?yōu)樽址?,需要指定日期格?/p>

    @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;

**結(jié)果截圖:**

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java &與&&的區(qū)別及實(shí)例

    java &與&&的區(qū)別及實(shí)例

    這篇文章主要介紹了java &與&&的區(qū)別的相關(guān)資料,并附簡(jiǎn)單實(shí)例,幫助大家學(xué)習(xí)理解這部分知識(shí),需要的朋友可以參考下
    2016-10-10
  • Java使用DSA密鑰對(duì)生成XML簽名的方法

    Java使用DSA密鑰對(duì)生成XML簽名的方法

    這篇文章主要介紹了Java使用DSA密鑰對(duì)生成XML簽名的方法,實(shí)例分析了java使用DSA密鑰對(duì)生成XML簽名的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • java反射獲取包下所有類的操作

    java反射獲取包下所有類的操作

    這篇文章主要介紹了java反射獲取包下所有類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 一文教會(huì)你如何搭建vue+springboot項(xiàng)目

    一文教會(huì)你如何搭建vue+springboot項(xiàng)目

    最近在搗鼓?SpringBoot?與?Vue?整合的項(xiàng)目,所以下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章教會(huì)你搭建vue+springboot項(xiàng)目,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • 高價(jià)值Java多線程面試題分析

    高價(jià)值Java多線程面試題分析

    Java?給多線程編程提供了內(nèi)置的支持。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。多線程是多任務(wù)的一種特別的形式,但多線程使用了更小的資源開銷
    2022-03-03
  • java定時(shí)調(diào)度器(Quartz)使用實(shí)例

    java定時(shí)調(diào)度器(Quartz)使用實(shí)例

    這篇文章主要介紹了java開源定時(shí)調(diào)度器使用方法
    2013-12-12
  • logback的DuplicateMessageFilter日志過(guò)濾操作源碼解讀

    logback的DuplicateMessageFilter日志過(guò)濾操作源碼解讀

    這篇文章主要為大家介紹了logback的DuplicateMessageFilter日志過(guò)濾操作源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 如何實(shí)現(xiàn)bean初始化摧毀方法的注入

    如何實(shí)現(xiàn)bean初始化摧毀方法的注入

    這篇文章主要為大家介紹了如何實(shí)現(xiàn)bean初始化摧毀方法的注入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java中數(shù)學(xué)相關(guān)類的使用教程

    Java中數(shù)學(xué)相關(guān)類的使用教程

    Java是一種廣泛使用的編程語(yǔ)言,它提供了許多數(shù)學(xué)運(yùn)算的函數(shù)和方法,使得開發(fā)者可以輕松地進(jìn)行各種數(shù)學(xué)計(jì)算,下面這篇文章主要給大家介紹了關(guān)于Java中數(shù)學(xué)相關(guān)類使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組的實(shí)現(xiàn)與應(yīng)用

    Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組的實(shí)現(xiàn)與應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中稀疏數(shù)組的實(shí)現(xiàn)與應(yīng)用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下
    2022-10-10

最新評(píng)論

孝昌县| 仙桃市| 胶州市| 潮州市| 综艺| 古交市| 黄陵县| 曲周县| 罗城| 台中县| 临夏市| 綦江县| 上栗县| 凤城市| 大同县| 施秉县| 社旗县| 翁牛特旗| 会昌县| 辉县市| 宁武县| 青铜峡市| 镇原县| 兴宁市| 交口县| 安化县| 阜平县| 商城县| 泽普县| 仙居县| 江津市| 稷山县| 南陵县| 工布江达县| 乐亭县| 蒙城县| 通海县| 浮山县| 安义县| 东方市| 改则县|