spring boot RestTemplate 發送get請求的踩坑及解決
spring boot RestTemplate 發送get請求踩坑
閑話少說,代碼說話
RestTemplate 實例
手動實例化,這個我基本不用
RestTemplate restTemplate = new RestTemplate();
依賴註入,通常情況下我使用 java.net 包下的類構建的 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 替換默認的 conver(默認的 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; } }
請求地址
get 請求 url 為
http://localhost:8080/test/sendSms?phone=手機號&msg=短信內容
錯誤使用
@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", "測試短信內容"); String result = restOperations.getForObject(url, String.class, uriVariables); }
服務器接收的時候你會發現,接收的該請求時沒有參數的
正確使用
@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", "測試短信內容"); String result = restOperations.getForObject(url, String.class, uriVariables); }
等價於
@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", "測試短信內容"); }
springboot restTemplate訪問get,post請求的各種方式
springboot中封裝好瞭訪問外部請求的方法類,那就是RestTemplate。下面就簡單介紹一下,RestTemplate訪問外部請求的方法。
get請求
首先get請求的參數是拼接在url後面的。所以不需要額外添加參數。但是也需要分兩種情況。
1、 有請求頭
由於 getForEntity() 和 getForObject() 都無法加入請求頭。所以需要請求頭的連接隻能使用 exchange() 來訪問。代碼如下
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、 無請求頭
無需請求頭的可以用三個方法實現。getForEntity() 和 getForObject() 還有 exchange() 都可以實現。下面講前兩種用的比較多的。
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請求
post請求也分幾種情況
1、參數在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、參數在body的x-www-from-urlencodeed裡面
隻需要把請求頭的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、參數在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; }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- RestTemplate實現發送帶headers的GET請求
- SpringBoot 如何使用RestTemplate來調用接口
- RestTemplate接口調用神器常見用法匯總
- 使用SpringBoot跨系統調用接口的方案
- java分佈式基於RestTemplate的使用方法