RestTemplate 是一个非常强大的 http 请求调用工具,根据它的名字就知道,它非常的适合调用 Rest 请求的场景。
在做 OAuth2 或者第三方认证的程序员中,我们往往需要进行 Basic 基本认证。这个涉及到 HttpHeaders 设置和 Basic 加密。
如果使用的不对,可能会报:org.springframework.web.client.HttpClientErrorException: 401 null 异常。我这里提供两种 HTTP Basic Authentication 基本认证用法。
第一种,使用 BasicAuthorizationInterceptor 拦截器。
restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor(username, password));
restTemplate.getForObject(url, String.class);
第二种,手动设置 HttpHeaders,并对用户名和密码进行 Base64 处理。
String auth_Str = username + ":" + password;
byte[] encodedAuth = Base64.encodeBase64(auth_Str.getBytes(Charset.forName("US-ASCII")));
String authHeader = "Basic " + new String(encodedAuth);
HttpHeaders headers = new HttpHeaders();
headers.set("authorization", authHeader);
restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null, headers),String.class).getBody();
注意上面的一个编码格式,US-ASCII。也可以不需要,具体看你的架构场景!
String user = "www.xttblog.com";
String password = "taoge";
String userMsg = user + ":" + password;
String base64UserMsg = Base64.getEncoder().encodeToString(userMsg.getBytes());
System.out.println("base64UserMsg:" + base64UserMsg);
String url = "http://url:port/api";
String postBody = "hello world";
HttpHeaders headers = new HttpHeaders();
headers.add("User-Agent", "www.xttblog.com");
headers.add("Authorization ", base64UserMsg);
HttpEntity<String> entity = new HttpEntity<>(postBody, headers);
ResponseEntity<JSONObject> response = restTemplate.postForEntity(url, entity, JSONObject.class);
System.out.println(response.getBody().toJSONString());
参考资料
- How to set an “Accept:” header on Spring RestTemplate request?
- HTTP 基本认证
- HTTP Basic Authentication 基本认证
: » RestTemplate 发送 Authorization Basic 认证
原创文章,作者:端木书台,如若转载,请注明出处:https://blog.ytso.com/tech/java/252186.html