本文是精講RestTemplate第9篇,前篇的blog訪問地址以下:html
服務提供方一般會經過必定的受權、鑑權認證邏輯來保護API接口。其中比較簡單、容易實現的方式就是使用HTTP 的Basic Auth來實現接口訪問用戶的認證。咱們本節就來爲你們介紹一下,在服務端加入Basic Auth認證的狀況下,該如何使用RestTemplate訪問服務端接口。vue
"admin"
,密碼是「 admin」,則將字符串"admin:admin"
使用Base64編碼算法加密。加密結果多是:YWtaW46YWRtaW4=。若是你想本身搭建一個服務端,那麼如何爲Spring Boot 服務添加Basic Auth認證?請參考個人另一篇文章:《Spring Security系列之Http Basic Auth登陸認證模式》 。java
固然咱們也能夠不用本身去搭建服務端,給你們介紹一個提供免費在線的RESTful接口服務的網站:httpbin.com。這個網站爲咱們提供了Basic Auth認證測試服務接口。若是咱們只是爲了學習RestTemplate,直接用這個網站提供的服務就能夠了。算法
瀏覽器訪問地址:http://www.httpbin.org/#/Auth/get_basic_auth__user___passwd_ ,這個接口服務是經過OpenAPI(swagger)實現的,因此能夠進行在線的訪問測試。因此能夠先經過頁面操做測試一下,再開始下面學習使用RestTemplate訪問服務端接口。spring
在HTTP請求頭中攜帶Basic Auth認證的用戶名和密碼,具體實現參考下文代碼註釋:後端
@SpringBootTest class BasicAuthTests { @Resource private RestTemplate restTemplate; @Test void testBasicAuth() { //該url上攜帶用戶名密碼是httpbin網站測試接口的要求, //真實的業務是不須要在url上體現basic auth用戶名密碼的 String url = "http://www.httpbin.org/basic-auth/admin/adminpwd"; //在請求頭信息中攜帶Basic認證信息(這裏纔是實際Basic認證傳遞用戶名密碼的方式) HttpHeaders headers = new HttpHeaders(); headers.set("authorization", "Basic " + Base64.getEncoder() .encodeToString("admin:adminpwd".getBytes())); //發送請求 HttpEntity<String> ans = restTemplate .exchange(url, HttpMethod.GET, //GET請求 new HttpEntity<>(null, headers), //加入headers String.class); //body響應數據接收類型 System.out.println(ans); } }
測試用例執行成功,說明RestTemplate 正確的攜帶了Basic 認證信息,獲得正常的響應結果:200。api
第三小節中的代碼雖然實現了功能,可是不夠好。由於每一次發送HTTP請求,咱們都須要去組裝HttpHeaders 信息,這樣很差,形成大量的代碼冗餘。那麼有沒有一種方式能夠實現能夠一次性的爲全部RestTemplate請求API添加Http Basic認證信息呢?答案就是:在RestTemplate Bean初始化的時候加入攔截器,以攔截器的方式統一添加Basic認證信息。瀏覽器
下面的代碼結合註釋去看,若是看不懂,須要去參考: 精講RestTemplate第2篇-多種底層HTTP客戶端類庫的切換
@Configuration public class ContextConfig { @Bean("OKHttp3") public RestTemplate OKHttp3RestTemplate(){ RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory()); //添加攔截器 restTemplate.getInterceptors().add(getCustomInterceptor()); return restTemplate; } //實現一個攔截器:使用攔截器爲每個HTTP請求添加Basic Auth認證用戶名密碼信息 private ClientHttpRequestInterceptor getCustomInterceptor(){ ClientHttpRequestInterceptor interceptor = (httpRequest, bytes, execution) -> { httpRequest.getHeaders().set("authorization", "Basic " + Base64.getEncoder() .encodeToString("admin:adminpwd".getBytes())); return execution.execute(httpRequest, bytes); }; return interceptor; } //這段代碼是《第3節-底層HTTP客戶端實現切換》的內容 private ClientHttpRequestFactory getClientHttpRequestFactory() { int timeout = 100000; OkHttp3ClientHttpRequestFactory clientHttpRequestFactory = new OkHttp3ClientHttpRequestFactory(); clientHttpRequestFactory.setConnectTimeout(timeout); return clientHttpRequestFactory; } }
在RestTemplate Bean初始化的時候加入攔截器以後,第三小節中的代碼就能夠省略HttpHeaders Basic Auth請求頭攜帶信息的組裝過程。發送請求,結果和第三小節中的效果是同樣的。springboot
上面的方式使用了攔截器,但仍然是咱們本身來封裝HTTP headers請求頭信息。進一步的簡化方法就是,Spring RestTemplate 已經爲咱們提供了封裝好的Basic Auth攔截器,咱們直接使用就能夠了,不須要咱們本身去實現攔截器。服務器
下面的方法是在RestTemplate Bean實例化的時候使用RestTemplateBuilder,自帶basicAuthentication。因此到這裏攔截器也不須要了(實際底層代碼實現仍然是攔截器,只是api層面不須要指定攔截器了)。
發送請求,結果和第三小節中的效果是同樣的。
以爲對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創做動力! 。另外,筆者最近一段時間輸出了以下的精品內容,期待您的關注。