Springboot-使用RestTemplate方式發(fā)HTTP請求及上傳文件

RestTemplate是Spring提供的用于訪問Rest服務(wù)的客戶端田柔,RestTemplate提供了多種便捷訪問遠(yuǎn)程Http服務(wù)的方法,能夠大大提高客戶端的編寫效率艾蓝。

我基于RestTemplate編寫了一個(gè)工具類,方便使用粪牲。工具類提供之提供了GET古瓤、POST、DELETE請求方法腺阳,其他方法自行補(bǔ)充


  1. Application啟動(dòng)類中實(shí)例RestTemplate
@SpringBootApplication
@RestController
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(ElasticApplication.class, args);
    }
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate(new HttpComponentsClientHttpRequestFactory());
    }
}
  1. RestTemplateUtils工具類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * RestTemplate工具類
 *
 * @author Colin.Ye
 * @version 1.0
 * @ClassName RestTemplateUtils
 * @date 2019/7/31
 **/
@Component
public class RestTemplateUtils {

    @Autowired
    private RestTemplate restTemplate;

    /**
     * POST請求-JSON參數(shù)
     *
     * @param url
     * @param params
     * @param headers
     * @return
     */
    public <T> T httpPostJson(String url, Map<String, Object> params, Map<String, String> headers, Class<T> clazz) {
        HttpHeaders httpHeaders = new HttpHeaders();
        if (headers != null) {
            headers.forEach((o1, o2) -> httpHeaders.add(o1, o2));
        }
        // json方式傳參
        return restTemplate.postForObject(url, new HttpEntity(params, httpHeaders), clazz);
    }

    /**
     * POST請求-FROM參數(shù)
     *
     * @param url
     * @param params
     * @param headers
     * @return
     */
    public <T> T httpPostFrom(String url, Map<String, Object> params, Map<String, String> headers, Class<T> clazz) {
        HttpHeaders httpHeaders = new HttpHeaders();
        params = params == null ? new LinkedHashMap<>() : params;
        if (headers != null) {
            headers.forEach((o1, o2) -> httpHeaders.add(o1, o2));
        }
        MultiValueMap<String, Object> stringObjectLinkedMultiValueMap = new LinkedMultiValueMap<>();
        params.forEach((o1, o2) -> stringObjectLinkedMultiValueMap.add(o1, o2));
        // 表單方式傳參
        // json方式傳參
        return restTemplate.postForObject(url, new HttpEntity(stringObjectLinkedMultiValueMap, httpHeaders), clazz);
    }

    /**
     * GET請求-?號參數(shù)
     *
     * @param url
     * @param params
     * @param headers
     * @return
     */
    public <T> T httpGetTraditional(String url, Map<String, Object> params, Map<String, String> headers, Class<T> clazz) {
        HttpHeaders httpHeaders = new HttpHeaders();
        params = params == null ? new LinkedHashMap<>() : params;
        if (headers != null) {
            headers.forEach((o1, o2) -> httpHeaders.add(o1, o2));
        }
        StringBuilder sb = new StringBuilder(url);
        sb.append("?");
        params.forEach((o1, o2) -> sb.append(o1).append("=").append(o2).append("&"));
        url = sb.toString().replaceAll("&$+|\\?$+", "");
        ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(null, httpHeaders), clazz);
        return exchange.getBody();
    }

    /**
     * GET請求-分隔符參數(shù)
     *
     * @param url
     * @param params LinkedHashMap
     * @param headers
     * @return
     */
    public <T> T httpGetPlaceholder(String url, List<String> params, Map<String, String> headers, Class<T> clazz) {
        HttpHeaders httpHeaders = new HttpHeaders();
        params = params == null ? new ArrayList<>() : params;
        if (headers != null) {
            headers.forEach((o1, o2) -> httpHeaders.add(o1, o2));
        }
        StringBuilder sb = new StringBuilder(url);
        params.forEach(o2 -> sb.append("/").append(o2));
        url = sb.toString().replaceAll("&$+|\\?$+", "");
        ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(null, httpHeaders), clazz);
        return exchange.getBody();
    }

    /**
     * DELETE請求-?號參數(shù)
     *
     * @param url
     * @param params
     * @param headers
     * @return
     */
    public <T> T httpDeleteTraditional(String url, Map<String, Object> params, Map<String, String> headers, Class<T> clazz) {
        HttpHeaders httpHeaders = new HttpHeaders();
        params = params == null ? new LinkedHashMap<>() : params;
        if (headers != null) {
            headers.forEach((o1, o2) -> httpHeaders.add(o1, o2));
        }
        StringBuilder sb = new StringBuilder(url);
        sb.append("?");
        params.forEach((o1, o2) -> sb.append(o1).append("=").append(o2).append("&"));
        url = sb.toString().replaceAll("&$+|\\?$+", "");
        ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.DELETE, new HttpEntity(null, httpHeaders), clazz);
        return exchange.getBody();
    }

    /**
     * DELETE請求-分隔符參數(shù)
     *
     * @param url
     * @param params
     * @param headers
     * @return
     */
    public <T> T httpDeletePlaceholder(String url, List<String> params, Map<String, String> headers, Class<T> clazz) {
        HttpHeaders httpHeaders = new HttpHeaders();
        params = params == null ? new ArrayList<>() : params;
        if (headers != null) {
            headers.forEach((o1, o2) -> httpHeaders.add(o1, o2));
        }
        StringBuilder sb = new StringBuilder(url);
        params.forEach(o2 -> sb.append("/").append(o2));
        url = sb.toString().replaceAll("&$+|\\?$+", "");
        ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.DELETE, new HttpEntity(null, httpHeaders), clazz);
        return exchange.getBody();
    }
}
  1. 使用
/**
 * @author Colin.Ye
 * @version 1.0
 * @ClassName LowCreateIndexDemo
 * @date 2019/3/13
 **/
@RestController
@RequestMapping("/lowClient/v1/")
@CrossOrigin
@DefaultProperties(defaultFallback = "defaultFallback")
public class LowCreateIndexDemo extends BaseController {

    @Autowired
    private RestTemplateUtils restTemplateUtils;

    @RequestMapping("/index")
    @Log
    @HystrixCommand(commandProperties = @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000"))

    public String index() {
        Map<String, Object> params = new HashMap<>();
        //  上傳文件
        FileSystemResource resource = new FileSystemResource(new File("/Users/yezhuang/Documents/data/oracle命令的副本.txt"));
        params.put("deviceId", "123424");
        params.put("file", resource);
        Object o = restTemplateUtils.httpPostFrom("http://localhost:10005/lowClient/v1/test", params, null, String.class);
        return o.toString();
    }

    @RequestMapping("/test")
    public String remoteUpdteTest(String deviceId, @RequestParam MultipartFile file) {
        System.out.println(deviceId);
        System.out.println(file.getName());
        return "success";
    }

    private String fallback() {
        return "網(wǎng)絡(luò)開小差了落君,請稍后重試···";
    }

    private String defaultFallback() {
        return "defaultFallback: 網(wǎng)絡(luò)開小差了,請稍后重試···";
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亭引,一起剝皮案震驚了整個(gè)濱河市绎速,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痛侍,老刑警劉巖朝氓,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魔市,死亡現(xiàn)場離奇詭異主届,居然都是意外死亡赵哲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門君丁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枫夺,“玉大人,你說我怎么就攤上這事绘闷∠鹋樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵印蔗,是天一觀的道長扒最。 經(jīng)常有香客問我,道長华嘹,這世上最難降的妖魔是什么吧趣? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮耙厚,結(jié)果婚禮上强挫,老公的妹妹穿的比我還像新娘。我一直安慰自己薛躬,他們只是感情好俯渤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著型宝,像睡著了一般八匠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趴酣,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天臀叙,我揣著相機(jī)與錄音,去河邊找鬼价卤。 笑死劝萤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慎璧。 我是一名探鬼主播床嫌,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胸私!你這毒婦竟也來了厌处?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤岁疼,失蹤者是張志新(化名)和其女友劉穎阔涉,沒想到半個(gè)月后缆娃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑰排,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年贯要,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椭住。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡崇渗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出京郑,到底是詐尸還是另有隱情宅广,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布些举,位于F島的核電站跟狱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏户魏。R本人自食惡果不足惜驶臊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绪抛。 院中可真熱鬧资铡,春花似錦、人聲如沸幢码。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽症副。三九已至店雅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贞铣,已是汗流浹背闹啦。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辕坝,地道東北人窍奋。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像酱畅,于是被迫代替她去往敵國和親琳袄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355