Http呼叫-靜態封裝類(RestTemplate)
1、問題描述
專案中封裝了個restTemplate的靜態呼叫類,分享下,希望能幫到需要的朋友。
2、解決方案
2.1 簡要說明:
以前用httpclient用的比較多,後來開始用restTemplate,查了兩者的區別,大部分無非就是:
(1)restTemplate是包含在spring包中的,使用起來更加方便一些,呼叫也簡潔一些;
(2)restTemplate的低層支援多種呼叫,比如:httpclient、HttpURLConnection等吧;
個人認為兩者都是為了傳送http請求,本質上區別不大,無非就是restTemplate又做了一層封裝,使用起來更加方便,程式碼更加簡潔而已。。
2.2 靜態呼叫類
完整程式碼:
import com.alibaba.fastjson.JSONObject; import org.apache.commons.lang3.StringUtils; import org.springframework.http.*; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; /** * http呼叫工具類,軟體老王 */ public class invokeUtils { /** * post呼叫,軟體老王 * * @param url * @param jsonString * @return */ public static String postInvoke(String url, String jsonString) { return invoke(url, jsonString, null, RequestMethod.POST); } /** * get呼叫,軟體老王 * * @param url * @return */ public static String getInvoke(String url) { return invoke(url, null, null, RequestMethod.GET); } /** * 通用,軟體老王 * * @param url * @param jsonString * @param token * @param requestMethod * @return */ public static String invoke(String url, String jsonString, String token, RequestMethod requestMethod) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8")); headers.add("Accept", MediaType.APPLICATION_JSON.toString()); if (!StringUtils.isEmpty(token)) { headers.add("Authorization", token); } HttpEntity<String> httpEntity; if (!StringUtils.isEmpty(jsonString)) { httpEntity = new HttpEntity<>(jsonString, headers); } else { httpEntity = new HttpEntity<>("parameters", headers); } RestTemplate rst = new RestTemplate(); ResponseEntity<String> responseEntity = null; if (RequestMethod.POST.equals(requestMethod)) { try { responseEntity = rst.postForEntity(url, httpEntity, String.class); } catch (Exception e) { return e.getMessage(); } return responseEntity.getBody(); } try { responseEntity = rst.exchange(url, HttpMethod.GET, httpEntity, String.class); } catch (Exception e) { return e.getMessage(); } return responseEntity.getBody(); } //測試 public static void main(String[] args) { Map map = new HashMap<>(); map.put("name", "laowang"); map.put("des", "shuaige"); String jsonString = JSONObject.toJSONString(map); invokeUtils.postInvoke("www.ruanjianlaowang.com", jsonString); } }
說明:
(1)入參為json格式,呼叫時候,需要把物件或者陣列轉換成json格式;MediaType是:application/json; charset=UTF-8
(2)3個靜態方法,postInvoke和getInvoke,根據傳參呼叫invoke;
(3)post請求使用的是:rst.postForEntity(url, httpEntity, String.class);
(4)get請求使用是:responseEntity = rst.exchange(url, HttpMethod.GET, httpEntity, String.class);
(5)可以結合上節提到的@PostConstruct標籤,實現靜態方法呼叫service動態方法,將呼叫入參、返回引數、響應時間等入庫。
2.3 程式碼驗證
(1)map轉json,如下圖;
(2)呼叫前,header中是:application/json; charset=UTF-8,body中是:{"des":"shuaige","name":"laowang"},如下圖:
更多資訊請關注公眾號:「軟體老王」,關注不迷路,軟體老王和他的IT朋友們,分享一些他們的技術見解和生活故事。
更多資訊請關注公眾號:「軟體老王」,關注不迷路,IT技術與相關乾貨分享,回覆關鍵字獲取對應乾貨,本文版權歸作者軟體老王所有,轉載需註明作者、超連結,否則保留追究法律責任的權利。