Java中的RestTemplate使用詳解
Java中的RestTemplate使用詳解
在開發(fā)中有時(shí)候經(jīng)常需要一些Http請求,請求數(shù)據(jù),下載內(nèi)容,也有一些簡單的分布式應(yīng)用直接使用Http請求作為跨應(yīng)用的交互協(xié)議。
在Java中有不同的Http請求方式,主要就是HttpURLConnection或者ApacheHttpClient,但是這兩個用起來都感覺有那么一點(diǎn)點(diǎn)的復(fù)雜;
好在Spring內(nèi)置了RestTemplate作為Http請求的工具類,簡化了很多操作,雖然Spring5推出了WebClient,但是整體感覺還是RestTemplate用起來更簡單方便一些。
這里記錄分享下RestTemplate的常見使用方式,RestTemplate作為Java中最簡單好用的Http請求工具類一定要了解一下
常見用法
簡單Get\Post請求
@Test public void testGetPost(){ RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new FastJsonHttpMessageConverter()); String res = restTemplate.postForObject("http://test.aihe.space/", null, String.class); System.out.println(res); String res2 = restTemplate.getForObject("http://test.aihe.space/", String.class); System.out.println(res2); }
Post提交常規(guī)表單
@Test public void testPostFrom(){ RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap<String, String> map= new LinkedMultiValueMap<>(); map.add("id", "1"); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); String fooResourceUrl = "http://test.aihe.space/"; ResponseEntity<String> response = restTemplate.postForEntity(fooResourceUrl, request, String.class); System.out.println(response.getStatusCode()); System.out.println(response.getBody()); }
Post上傳文件
注意:上傳文件時(shí)的value為 FileSystemResource
@Test public void testPostFile(){ RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap<String, Object> map= new LinkedMultiValueMap<>(); map.add("id", "1"); map.add("file",new FileSystemResource("/Users/aihe/code/init/src/test/java/me/aihe/RestTemplateTest.java")); HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map, headers); String fooResourceUrl = "http://test.aihe.space/"; ResponseEntity<String> response = restTemplate.postForEntity(fooResourceUrl, request, String.class); System.out.println(response.getStatusCode()); System.out.println(response.getBody()); }
配置項(xiàng)
請求添加Cookie\Header
@Test public void testCookieHeader(){ RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap<String, Object> map= new LinkedMultiValueMap<>(); // 常見的Header都可以直接設(shè)置 // headers.set headers.set("custom1","customValue1"); // 設(shè)置Cookie headers.set(HttpHeaders.COOKIE,"xxxx"); map.add("id", "1"); HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map, headers); String fooResourceUrl = "http://test.aihe.space/"; ResponseEntity<String> response = restTemplate.postForEntity(fooResourceUrl, request, String.class); System.out.println(response.getStatusCode()); System.out.println(response.getBody()); }
配置請求工廠超時(shí)、代理
使用Rest請求的時(shí)候注意設(shè)置超時(shí)時(shí)間
@Test public void testHttpFactory(){ RestTemplate restTemplate = new RestTemplate(); SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setReadTimeout(5000); requestFactory.setConnectTimeout(3000); Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 7890)); requestFactory.setProxy(proxy); restTemplate.setRequestFactory(requestFactory); restTemplate.getMessageConverters().add(new FastJsonHttpMessageConverter()); String res = restTemplate.postForObject("http://test.aihe.space/", null, String.class); System.out.println(res); }
配置攔截器、轉(zhuǎn)換器,錯誤處理
@Test public void testConverterInterceptor(){ RestTemplate restTemplate = new RestTemplate(); restTemplate.setInterceptors(Collections.singletonList(new BasicAuthenticationInterceptor("admin","admin"))); restTemplate.getMessageConverters().add(new FastJsonHttpMessageConverter()); restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); String res = restTemplate.postForObject("http://test.aihe.space/", null, String.class); System.out.println(res); }
錯誤重試(額外)
可以考慮使用Spring Retry,但是相當(dāng)于引入了新的東西,如果沒有特殊必要,可以自己簡單用for循環(huán)做下;
// Spring Retry方式 @Bean public RetryTemplate retryTemplate() { int maxAttempt = Integer.parseInt(env.getProperty("maxAttempt")); int retryTimeInterval = Integer.parseInt(env.getProperty("retryTimeInterval")); SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); retryPolicy.setMaxAttempts(maxAttempt); FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy(); // 失敗的間隔 backOffPolicy.setBackOffPeriod(retryTimeInterval); RetryTemplate template = new RetryTemplate(); template.setRetryPolicy(retryPolicy); template.setBackOffPolicy(backOffPolicy); return template; }
SSL請求
@Test public void testSSL() throws FileNotFoundException, NoSuchAlgorithmException, KeyStoreException, UnrecoverableKeyException { String keyStorePassword = "123456"; KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(new FileInputStream(new File("keyStoreFile")), keyStorePassword.toCharArray()); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( new SSLContextBuilder() .loadTrustMaterial(null, new TrustSelfSignedStrategy()) .loadKeyMaterial(keyStore, keyStorePassword.toCharArray()) .build(), NoopHostnameVerifier.INSTANCE); HttpClient httpClient = HttpClients.custom().setSSLSocketFactory( socketFactory).build(); ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory( httpClient); RestTemplate restTemplate = new RestTemplate(requestFactory); String res = restTemplate.postForObject("http://test.aihe.space/", null, String.class); System.out.println(res); }
基于RestTemplate一些工具
釘釘機(jī)器人通知
可以支持發(fā)送普通文本、ActionCard,Markdown的消息
import java.util.ArrayList; import java.util.List; import lombok.Data; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; /** * 使用場景: * 功能描述:https://developers.dingtalk.com/document/app/custom-robot-access/title-72m-8ag-pqw */ @Slf4j public class RobotUtils { private static RestTemplate restTemplate = new RestTemplate(); private static String URL = ""; public static void main(String[] args) { sendMarkDownMsg( URL, "測試", "測試", new ArrayList<>() ); } /** * { * "msgtype": "text", * "text": { * "content": "我就是我, @150XXXXXXXX 是不一樣的煙火" * }, * "at": { * "atMobiles": [ * "150XXXXXXXX" * ], * "isAtAll": false * } * } */ public static void sendTextMsg(String url, String content, List<String> atPerson) { RobotMsg robotMsg = new RobotMsg(); robotMsg.setMsgtype("text"); RobotAt robotAt = new RobotAt(); robotAt.setAtAll(false); if (atPerson != null && atPerson.size() > 0) { robotAt.setAtMobiles(atPerson); } robotMsg.setAt(robotAt); RobotText robotText = new RobotText(); robotText.setContent(content); robotMsg.setText(robotText); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, robotMsg, String.class); log.info("sendTextMsg {}",responseEntity.getBody()); } /** * @param url 機(jī)器人地址 * @param title actionCard標(biāo)題 * @param text 縮略內(nèi)容 * @param vertical 按鈕方向 * @param btns 按鈕內(nèi)容 */ public static void sendActionCardMsg(String url, String title, String text, Boolean vertical, List<RobotBtn> btns) { RobotMsg robotMsg = new RobotMsg(); robotMsg.setMsgtype("actionCard"); RobotAt robotAt = new RobotAt(); robotAt.setAtAll(false); RobotActionCard robotActionCard = new RobotActionCard(); robotActionCard.setTitle(title); robotActionCard.setText(text); robotActionCard.setBtnOrientation((vertical == null || vertical) ? "0" : "1"); robotActionCard.setBtns(btns); robotMsg.setActionCard(robotActionCard); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, robotMsg, String.class); System.out.println(responseEntity.getBody()); } public static void sendMarkDownMsg(String url,String title,String text,List<String> atPerson){ RobotMarkDownMsg markDownMsg = new RobotMarkDownMsg(); markDownMsg.setMsgtype("markdown"); RobotAt robotAt = new RobotAt(); robotAt.setAtAll(false); if (atPerson != null && atPerson.size() > 0) { robotAt.setAtMobiles(atPerson); } markDownMsg.setAt(robotAt); RobotMarkdownText markdownText = new RobotMarkdownText(); markdownText.setTitle(title); markdownText.setText(text); markDownMsg.setMarkdown(markdownText); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, markDownMsg, String.class); System.out.println(responseEntity.getBody()); } public enum SupportRobotEnum { /** * 測試機(jī)器人群 */ CESHI("測試機(jī)器人群", ""); @Getter private String desc; @Getter private String url; SupportRobotEnum(String desc, String url) { this.desc = desc; this.url = url; } } @Data public static class RobotAt { public List<String> atMobiles; public boolean isAtAll; } @Data public static class RobotMarkDownMsg{ public String msgtype; public RobotAt at; public RobotMarkdownText markdown; } @Data public static class RobotMarkdownText { String title; String text; } @Data public static class RobotMsg { public String msgtype; public RobotAt at; /** * 普通文字消息類型消息 */ public RobotText text; /** * actionCard類型消息時(shí)支持 */ public RobotActionCard actionCard; } @Data public static class RobotText { public String content; } @Data public static class RobotActionCard { public String title; public String text; public String hideAvatar; public String btnOrientation; public List<RobotBtn> btns; } @Data public static class RobotBtn { public String title; public String actionURL; public static RobotBtn buildBtn(String title, String actionUrl) { RobotBtn robotBtn = new RobotBtn(); robotBtn.setActionURL(actionUrl); robotBtn.setTitle(title); return robotBtn; } } }
總結(jié)
1、 Http請求在開發(fā)過程中也是一個常見的高頻操作;
2、Spring封裝了Http的工具類RestTemplate非常好用,基本上滿足了所有Http相關(guān)的需求。
3、這里介紹整理了下RestTemplate的常見使用方式,遇到有對應(yīng)的內(nèi)容,直接翻閱使用即可。
到此這篇關(guān)于Java中的RestTemplate使用詳解的文章就介紹到這了,更多相關(guān)Java中的RestTemplate內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java利用Reflect實(shí)現(xiàn)封裝Excel導(dǎo)出工具類
這篇文章主要為大家詳細(xì)介紹了Java如何利用Reflect實(shí)現(xiàn)封裝Excel導(dǎo)出工具類,文中的實(shí)現(xiàn)方法講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-11-11springboot如何獲取yaml/yml(或properties)配置文件信息
在SpringBoot項(xiàng)目中,讀取配置文件信息是常見需求,可以通過@Autowired注入Environment類,使用@Value注解直接注入配置信息,或定義工具類結(jié)合ApplicationRunner進(jìn)行高級配置信息獲取,特別提到2024-11-11Spring Boot 整合 MyBatis 連接數(shù)據(jù)庫及常見問題
MyBatis 是一個優(yōu)秀的持久層框架,支持定制化 SQL、存儲過程以及高級映射,下面詳細(xì)介紹如何在 Spring Boot 項(xiàng)目中整合 MyBatis 并連接數(shù)據(jù)庫,感興趣的朋友一起看看吧2025-03-03Java后臺實(shí)現(xiàn)瀏覽器一鍵導(dǎo)出下載zip壓縮包
這篇文章主要為大家詳細(xì)介紹了Java后臺實(shí)現(xiàn)瀏覽器一鍵導(dǎo)出下載zip壓縮包,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07SpringBoot使用ApplicationEvent&Listener完成業(yè)務(wù)解耦
這篇文章主要介紹了SpringBoot使用ApplicationEvent&Listener完成業(yè)務(wù)解耦示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05