1. 程式人生 > 其它 >Spring Framework RestTemplate 代理方案

Spring Framework RestTemplate 代理方案

技術標籤:Javajavahttpspring bootspringmvcrpc

利用Spring Framework RestTemplate 做代理

今天我們會介紹如何使用Spring Framework 提供的 RestTemplate類做一層中間代理。

其實原理很簡單,就是通過向目標伺服器傳送HTTP請求以實現遠端呼叫的功能。

假設以下場景,我們正在運維一個圖書館管理系統,我們的資料庫中儲存了每一本書的書名和作者,但是在下次系統更新中我們期望還可以讓使用者們看到每本書的種類,可是我們庫中沒有儲存有關書本種類的資訊。

聰明的小明在去聯絡了書本供應商,發現他們也有一個系統,不光儲存了書本種類,還有各種其他好玩的資訊。

現在小明心中有兩個方案,方案一是刷庫,把供應商庫裡所需要的資訊全部拉到自己的庫裡。方案二是讓供應商為自己開一個介面,自己做一層代理,直接從供應商那裡取資料。

第一種方案不光需要重構資料庫,還要額外佔用大量的硬碟資源,小明決定採用第二種方案。

以下為方案的詳細說明:

供應商開放一個介面,接收http post請求,並返回有關書本的各種資訊。

供應商介面接收Json String,讀取資料並從資料庫中查詢資料,之後將查詢到的資料封裝進HashMap中,轉換成Json並返回。

這樣一來,我們需要做的僅僅是將想傳送的資料轉換成Json String幷包在http請求正文裡面,發給供應商再從那裡拿回資料就可以了,這是一個經典的RPC - HTTP遠端呼叫流程。

以下為小明的程式碼:

// http 請求頭設定請求正文型別為Json
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

Map<String, Object> body = Maps.newHashMap();
body.put("書名", bookTitle);
body.put("作者", author);

// 將hash map先轉換成Json,再轉換二進位制位元組流,再解析成String。
String secStr =
Base64.getEncoder().encodeToString(GsonUtil.toJson(body).getBytes()); //將請求頭和body封裝進HttpEntity類中 HttpEntity<String> entity = new HttpEntity<>(secStr, headers); //可以利用secret自定義簽名來證明請求的合法性。 String localSign = DigestUtils.md5Hex(自定義簽名); String postUrl = 自定義運營商介面的URL // 使用RestTemplate的postForObject方法將http請求傳送給運營商並接收返回資料。 RestTemplate restTemplate = new RestTemplate(); //引數為運營商url,HttpEntity例項,和返回資料的型別,這裡我們想把接受的資料轉換為Map。 Map<String, Object> response = restTemplate.postForObject(postUrl, entity, Map.class);

伺服器拿到書名和作者後,通過查庫拿到其他資訊,再將資訊返回給小明。

之後小明直接從返回的Map裡面拿資料就可以啦,這樣一來是不是很好的解決了從其他系統拉資料的問題呢 ~