中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RestTemplate?Get請求如何實現bean參數傳遞

發布時間:2022-11-18 10:15:41 來源:億速云 閱讀:159 作者:iii 欄目:開發技術

今天小編給大家分享一下RestTemplate Get請求如何實現bean參數傳遞的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

項目場景

Spring 的 RestTemplate 是一個健壯的、流行的基于 Java 的 Http客戶端。

RestTemplate實現request param參數傳送,如果如下所示,直接傳一個map對象,調試之后是不會接收到參數的

Map<String,Object> param = new HashMap<String,Object>();
param.put("since",10);
restTemplate.getForObject("https://api.github.com/users" , UserDto.class, param);

所以,正確的用法是使用占位符:

Map<String,Object> param = new HashMap<String,Object>();
param.put("since",10);
restTemplate.getForObject("https://api.github.com/users?since={since}" , UserDto.class, param);

問題描述

但是參數一多,我們每個都寫占位符,那不是很麻煩,直接丟一個javabean不可以?直接丟個javabean,或者轉為map參數都不能直接傳過來

RestTemplate?Get請求如何實現bean參數傳遞

原因分析

通過查看RestTemplate源碼:org.springframework.web.client.RestTemplate#initUriTemplateHandler

RestTemplate?Get請求如何實現bean參數傳遞

DefaultUriBuilderFactory是RestTemplateURL處理的工廠類,基層接口是UriTemplateHandler,所以可以重新定義一下UriTemplateHandler

解決方案

下面介紹一種方法,可以重寫UriTemplateHandler 接口,在RestTemplate源碼里找到這個接口是對接口參數進行處理的

package com.example.resttemplate.configuration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.DefaultUriBuilderFactory;
import org.springframework.web.util.UriComponentsBuilder;
import org.springframework.web.util.UriTemplateHandler;
import java.net.URI;
import java.util.Map;
@Slf4j
public class RestGetUriTemplateHandler implements UriTemplateHandler {
    private UriTemplateHandler uriTemplateHandler = new DefaultUriBuilderFactory();
    @Override
    public URI expand(String uriTemplate, Map<String, ?> uriVariables) {
    	// 使用UriComponentsBuilder 構建請求的鏈接,也是拼參數的方法
        UriComponentsBuilder builder = UriComponentsBuilder
                .fromHttpUrl(uriTemplate);
        for (Map.Entry<String, ?> entry : uriVariables.entrySet()) {
            builder.queryParam(entry.getKey(), entry.getValue());
        }
        String uriString = builder.toUriString();
        log.info("uriString:[{}]" , uriString);
        return uriTemplateHandler.expand(uriString , uriVariables);
    }
    @Override
    public URI expand(String uriTemplate, Object... uriVariables) {
        return uriTemplateHandler.expand(uriTemplate, uriVariables);
    }
}

使用Hutool的工具類,轉換bean類為map對象,import cn.hutool.core.bean.BeanUtil;

restTemplate.setUriTemplateHandler(new RestGetUriTemplateHandler());
Map<String,Object> param = BeanUtil.beanToMap(queryDto);
restTemplate.getForObject("https://api.github.com/users/mojombo", UserDto.class , param);

也可以借助apache-commont的工具類進行轉換,import org.apache.commons.beanutils.BeanUtilsBean;

Map<String, String> paramMap = BeanUtilsBean.getInstance().describe(bean);

運行之后,可以發現參數帶上去了,之后調第三方接口,直接傳個javabean就可以,方便很多,也可以對javabean轉map的操作進行封裝,之后直接調用

RestTemplate?Get請求如何實現bean參數傳遞

以上就是“RestTemplate Get請求如何實現bean參數傳遞”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双辽市| 大悟县| 泰来县| 亳州市| 晋江市| 离岛区| 武穴市| 鄂伦春自治旗| 新巴尔虎左旗| 古蔺县| 万载县| 九寨沟县| 鲜城| 青岛市| 泸西县| 山阳县| 林西县| 湄潭县| 拜城县| 同心县| 巩留县| 富阳市| 平谷区| 大连市| 尼勒克县| 永年县| 富民县| 筠连县| 惠东县| 漳平市| 普兰店市| 固阳县| 台南县| 靖西县| 江源县| 开平市| 清水河县| 揭阳市| 镇赉县| 离岛区| 河东区|