本文是精讲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层面不须要指定拦截器了)。
发送请求,结果和第三小节中的效果是同样的。
以为对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创做动力! 。另外,笔者最近一段时间输出了以下的精品内容,期待您的关注。