spring boot RestTemplate 發(fā)送get請(qǐng)求的踩坑及解決
spring boot RestTemplate 發(fā)送get請(qǐng)求踩坑
閑話少說,代碼說話
RestTemplate 實(shí)例
手動(dòng)實(shí)例化,這個(gè)我基本不用
RestTemplate restTemplate = new RestTemplate();
依賴注入,通常情況下我使用 java.net 包下的類構(gòu)建的 SimpleClientHttpRequestFactory
@Configuration
public class RestConfiguration {
@Bean
@ConditionalOnMissingBean({RestOperations.class, RestTemplate.class})
public RestOperations restOperations() {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setReadTimeout(5000);
requestFactory.setConnectTimeout(5000);
RestTemplate restTemplate = new RestTemplate(requestFactory);
// 使用 utf-8 編碼集的 conver 替換默認(rèn)的 conver(默認(rèn)的 string conver 的編碼集為 "ISO-8859-1")
List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator();
while (iterator.hasNext()) {
HttpMessageConverter<?> converter = iterator.next();
if (converter instanceof StringHttpMessageConverter) {
iterator.remove();
}
}
messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
return restTemplate;
}
}
請(qǐng)求地址
get 請(qǐng)求 url 為
http://localhost:8080/test/sendSms?phone=手機(jī)號(hào)&msg=短信內(nèi)容
錯(cuò)誤使用
@Autowired
private RestOperations restOperations;
public void test() throws Exception{
String url = "http://localhost:8080/test/sendSms";
Map<String, Object> uriVariables = new HashMap<String, Object>();
uriVariables.put("phone", "151xxxxxxxx");
uriVariables.put("msg", "測(cè)試短信內(nèi)容");
String result = restOperations.getForObject(url, String.class, uriVariables);
}
服務(wù)器接收的時(shí)候你會(huì)發(fā)現(xiàn),接收的該請(qǐng)求時(shí)沒有參數(shù)的
正確使用
@Autowired
private RestOperations restOperations;
public void test() throws Exception{
String url = "http://localhost:8080/test/sendSms?phone={phone}&msg={phone}";
Map<String, Object> uriVariables = new HashMap<String, Object>();
uriVariables.put("phone", "151xxxxxxxx");
uriVariables.put("msg", "測(cè)試短信內(nèi)容");
String result = restOperations.getForObject(url, String.class, uriVariables);
}
等價(jià)于
@Autowired
private RestOperations restOperations;
public void test() throws Exception{
String url = "http://localhost:8080/test/sendSms?phone={phone}&msg={phone}";
String result = restOperations.getForObject(url, String.class, "151xxxxxxxx", "測(cè)試短信內(nèi)容");
}
springboot restTemplate訪問get,post請(qǐng)求的各種方式
springboot中封裝好了訪問外部請(qǐng)求的方法類,那就是RestTemplate。下面就簡(jiǎn)單介紹一下,RestTemplate訪問外部請(qǐng)求的方法。
get請(qǐng)求
首先get請(qǐng)求的參數(shù)是拼接在url后面的。所以不需要額外添加參數(shù)。但是也需要分兩種情況。
1、 有請(qǐng)求頭
由于 getForEntity() 和 getForObject() 都無(wú)法加入請(qǐng)求頭。所以需要請(qǐng)求頭的連接只能使用 exchange() 來(lái)訪問。代碼如下
public JSONObject test(){
try {
RestTemplate re = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
String url = "http://test.api.com?id=123";
headers.set("Content-Type","application/json");
HttpEntity<JSONObject> jsonObject= re.exchange(url, HttpMethod.GET,new HttpEntity<>(headers),JSONObject.class);
log.info("返回:{}",jsonObject.getBody());
return jsonObject.getBody();
}catch (Exception e){
log.error(e.getMessage());
}
return null;
}
2、 無(wú)請(qǐng)求頭
無(wú)需請(qǐng)求頭的可以用三個(gè)方法實(shí)現(xiàn)。getForEntity() 和 getForObject() 還有 exchange() 都可以實(shí)現(xiàn)。下面講前兩種用的比較多的。
getForEntity()
public JSONObject test(){
try {
RestTemplate re = new RestTemplate();
String url = "http://api.help.bj.cn/apis/alarm/?id=101020100";
HttpEntity<JSONObject> jsonObject= re.getForEntity(url,JSONObject.class);
log.info("返回:{}",jsonObject.getBody());
return jsonObject.getBody();
}catch (Exception e){
log.error(e.getMessage());
}
return null;
}
getForObject()
public JSONObject test(){
try {
RestTemplate re = new RestTemplate();
String url = "http://api.help.bj.cn/apis/alarm/?id=101020100";
JSONObject jsonObject= re.getForObject(url,JSONObject.class);
log.info("返回:{}",jsonObject);
return jsonObject;
}catch (Exception e){
log.error(e.getMessage());
}
return null;
}
post請(qǐng)求
post請(qǐng)求也分幾種情況
1、參數(shù)在body的form-data里面
public static JSONObject test(){
try {
RestTemplate re = new RestTemplate();
String url = "http://localhost:8101/test";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> loginJson = new LinkedMultiValueMap<>();
loginJson.add("id", "123");
JSONObject jsonObject= re.postForObject(url,new HttpEntity<>(loginJson,headers),JSONObject.class);
log.info("返回:{}",jsonObject);
return jsonObject;
}catch (Exception e){
log.error(e.getMessage());
}
return null;
}
還可以把 postForObject 換成 postForEntity
2、參數(shù)在body的x-www-from-urlencodeed里面
只需要把請(qǐng)求頭的setContentType改成下面即可
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
public static JSONObject test(){
try {
RestTemplate re = new RestTemplate();
String url = "http://localhost:8101/test";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, Object> loginJson = new LinkedMultiValueMap<>();
loginJson.add("id", "123");
JSONObject jsonObject= re.postForObject(url,new HttpEntity<>(loginJson,headers),JSONObject.class);
log.info("返回:{}",jsonObject);
return jsonObject;
}catch (Exception e){
log.error(e.getMessage());
}
return null;
}
3、參數(shù)在body的raw里面

public static JSONObject test(){
try {
RestTemplate re = new RestTemplate();
String url = "http://localhost:8101/test";
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type","application/json");
JSONObject jsonObject = new JSONObject();
jsonObject.put("id","1");
JSONObject jsonObject1 = restTemplate
.postForObject(url,new HttpEntity<>(jsonObject,headers),JSONObject.class);
log.info("返回:{}",jsonObject1);
return jsonObject;
}catch (Exception e){
log.error(e.getMessage());
}
return null;
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 關(guān)于RestTemplate中的Get請(qǐng)求
- RestTemplate調(diào)用POST和GET請(qǐng)求示例詳解
- RestTemplate Get請(qǐng)求實(shí)現(xiàn)bean參數(shù)傳遞詳解
- RestTemplate發(fā)送HTTP?GET請(qǐng)求使用方法詳解
- RestTemplate實(shí)現(xiàn)發(fā)送帶headers的GET請(qǐng)求
- 解決RestTemplate 的getForEntity調(diào)用接口亂碼的問題
- RestTemplate發(fā)送get和post請(qǐng)求,下載文件的實(shí)例
- RestTemplate get請(qǐng)求攜帶headers自動(dòng)拼接參數(shù)方式
相關(guān)文章
SpringBoot項(xiàng)目部署到騰訊云的實(shí)現(xiàn)步驟
本文主要介紹了SpringBoot項(xiàng)目部署到騰訊云的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
SpringBoot 下的 Static 文件夾打包成前端資源的示例代碼
這篇文章主要介紹了SpringBoot 下的 Static 文件夾如何打包成前端資源,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
java8 實(shí)現(xiàn)提取集合對(duì)象的每個(gè)屬性
這篇文章主要介紹了java8 實(shí)現(xiàn)提取集合對(duì)象的每個(gè)屬性方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-02-02
SpringBoot?模板模式實(shí)現(xiàn)優(yōu)惠券邏輯的示例代碼
這篇文章主要介紹了SpringBoot?模板模式實(shí)現(xiàn)優(yōu)惠券邏輯,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08

