Spring RestTemplate的使用與踩坑
引言
最近的項(xiàng)目需求中有使用到后端發(fā)送http請(qǐng)求,在網(wǎng)上尋找資料后發(fā)現(xiàn)可以使用spring自帶的RestTemplate類(lèi)實(shí)現(xiàn),故作此記錄
項(xiàng)目使用
將下述代碼引入spring容器中(RestTemplate是spring自帶的發(fā)送http請(qǐng)求的類(lèi))
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
RestTemplate restTemplate = new RestTemplate(factory);
return restTemplate;
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);
factory.setConnectTimeout(15000);
// 設(shè)置代理
//factory.setProxy(null);
return factory;
}
在需要使用的類(lèi)中直接引入即可
@Autowired private RestTemplate restTemplate;
代碼示例
這里簡(jiǎn)單示例下post請(qǐng)求,如果又其它需求的可以去搜索一下其它文章
**注意:**發(fā)送的post的傳參的類(lèi)型一定要是LinkedMultiValueMap(不能使用jsonobject),否則會(huì)報(bào)找不到數(shù)據(jù)的錯(cuò)誤
@GetMapping("send")
public String testPost(@RequestParam("code") Integer code){
String url = "http://localhost:8888/oauth/return";
LinkedMultiValueMap<String, Object> stringObjectLinkedMultiValueMap = new LinkedMultiValueMap<>();
stringObjectLinkedMultiValueMap.set("code",code);
HttpEntity<LinkedMultiValueMap<String, Object>> jsonObjectHttpEntity = new HttpEntity<>(stringObjectLinkedMultiValueMap);
ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(url, jsonObjectHttpEntity, String.class);
String body = stringResponseEntity.getBody();
return body;
}
@PostMapping("return")
public String returnPost(@RequestParam Integer code){
return "哈首府帕斯發(fā)";
}
踩坑記錄
發(fā)送POST請(qǐng)求傳參的問(wèn)題
如下代碼,如果使用jsonobject來(lái)裝載數(shù)據(jù)發(fā)送post請(qǐng)求是會(huì)報(bào)錯(cuò)的,只能使用LinkedMultiValueMap
@GetMapping("keycloak/getToken")
public String keycloakGetToken(@RequestParam Map<String,String> map){
//String code = requestObj.getString("code");
String url = "http://localhost:8081/auth/realms/myRealm/protocol/openid-connect/token";
String code = map.get("code");
System.out.println("傳進(jìn)來(lái)的code:"+code);
//HttpHeaders headers = new HttpHeaders();
//JSONObject jsonObject = new JSONObject();
//jsonObject.put("grant_type","authorization_code");
//jsonObject.put("code",code);
//jsonObject.put("client_id","myclient");
//jsonObject.put("client_secret","LsvDoZ5g0BQhRDR9ydYqV9tjal8YDeAI");
//jsonObject.put("scope","openid");
//jsonObject.put("redirect_uri","http://localhost:8888/oauth/keycloak/getToken");
//HttpEntity<JSONObject> jsonObjectHttpEntity = new HttpEntity<>(jsonObject,headers);
LinkedMultiValueMap<String, Object> stringObjectLinkedMultiValueMap = new LinkedMultiValueMap<>();
stringObjectLinkedMultiValueMap.set("grant_type","authorization_code");
stringObjectLinkedMultiValueMap.set("code",code);
stringObjectLinkedMultiValueMap.set("client_id","myclient");
stringObjectLinkedMultiValueMap.set("client_secret","LsvDoZ5g0BQhRDR9ydYqV9tjal8YDeAI");
stringObjectLinkedMultiValueMap.set("scope","openid");
stringObjectLinkedMultiValueMap.set("redirect_uri","http://localhost:8888/oauth/keycloak/getToken");
HttpEntity<LinkedMultiValueMap<String, Object>> jsonObjectHttpEntity = new HttpEntity<>(stringObjectLinkedMultiValueMap);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, jsonObjectHttpEntity, String.class);
String body = responseEntity.getBody();
return body;
}
到此這篇關(guān)于Spring RestTemplate的使用與踩坑的文章就介紹到這了,更多相關(guān)Spring RestTemplate內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot-RestTemplate實(shí)現(xiàn)調(diào)用第三方API的方式
- Springboot使用RestTemplate調(diào)用第三方接口的操作代碼
- Spring?RestTemplate遠(yuǎn)程調(diào)用過(guò)程
- SpringCloud基于RestTemplate微服務(wù)項(xiàng)目案例解析
- Springboot?RestTemplate設(shè)置超時(shí)時(shí)間的簡(jiǎn)單方法
- 解析Spring RestTemplate必須搭配MultiValueMap的理由
- Springboot之restTemplate的配置及使用方式
相關(guān)文章
利用SpringBoot和LiteFlow解鎖復(fù)雜流程
隨著業(yè)務(wù)的復(fù)雜化,企業(yè)需要更加高效、便捷地管理自己的業(yè)務(wù)流程,這就需要借助一些流程引擎實(shí)現(xiàn),今天,我們就來(lái)介紹一種基于Java語(yǔ)言開(kāi)發(fā)的輕量級(jí)工作流引擎——LiteFlow,以及如何在Spring Boot框架中集成它,從而提高企業(yè)的工作效率和開(kāi)發(fā)效率2023-06-06
IDEA?Debug過(guò)程中使用Drop?Frame或Reset?Frame實(shí)現(xiàn)操作回退的方法
在IDEA中就提供了一個(gè)幫助你回退代碼的機(jī)會(huì),但這個(gè)方法并不是萬(wàn)能的,好了,下面就來(lái)具體說(shuō)說(shuō)IDEA?Debug過(guò)程中使用Drop?Frame或Reset?Frame實(shí)現(xiàn)操作回退的方法,感興趣的朋友一起看看吧2022-04-04
在SpringBoot中通過(guò)jasypt進(jìn)行加密解密的方法
今天小編就為大家分享一篇關(guān)于在SpringBoot中通過(guò)jasypt進(jìn)行加密解密的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
Sentinel?Gateway自定義限流返回結(jié)果方式
這篇文章主要介紹了Sentinel?Gateway自定義限流返回結(jié)果方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
JAVA如何判斷上傳文件后綴名是否符合規(guī)范MultipartFile
這篇文章主要介紹了JAVA判斷上傳文件后綴名是否符合規(guī)范MultipartFile,文中通過(guò)實(shí)例代碼介紹了java實(shí)現(xiàn)對(duì)上傳文件做安全性檢查,需要的朋友可以參考下2023-11-11
MyBatis在DAO層定義接口返回類(lèi)型泛型無(wú)效的解決
這篇文章主要介紹了MyBatis在DAO層定義接口返回類(lèi)型泛型無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

