介绍
在本系列的第一部分(link here)中,介绍了Java HTTP客户端API的基本功能。现在,我们将探索一些在当今应用程序中广泛使用的一些常见用例。
我们将学习如何通过提供凭据来访问有担保的端点。
基本身份验证
基本身份验证是保护Internet上Web资源的一种简单方法。它的工作如下:
- 客户希望通过HTTP访问受保护的资源并提供用户名/密码。信条发送在授权HTTP标题中。格式很重要,必须完全如下:基本凭据,其中凭据是用户名的基本64编码:密码。在此处注意UsEname和密码之间的单一结肠。
- Web服务器收到HTTP请求,从标头中提取编码的凭据并验证它。如果不匹配,它通常会返回401状态代码(未经授权的错误)。如果匹配它将允许访问。
现在我们知道了理论,让我们付诸实践。现在,由于Spring Security模块,我们在上一篇文章中使用的端点现在得到了保护(这将是将来的文章,因此请继续关注!)。试图通过执行以下代码获取客户列表
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:8080/api/v1/customers"))
.GET()
.build();
HttpResponse<String> response = client
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.printf("Status %s \n", response.statusCode());
响应返回401代码。因此,必须发送凭据
Status 401
使用HTTP标头进行身份验证
将凭据传递到端点的第一种方法是在HTTP请求对象中设置标头。 httprequest类包含两个不同的方法来添加/设置标头:
-
SETHEADER方法将给定名称/值对设置为此请求的标题集。这将覆盖名称的任何先前设置的值。
-
另一方面,标头方法将给定名称/值对添加到此请求的标题集中。给定值添加到该名称的值列表中。
还有第三个添加多个标头的选项。在这里,我们只会调用标头方法。代码接下来显示
String credentials = "user1234:password5678";
String headerValue = "Basic " + Base64.getEncoder()
.encodeToString(credentials.getBytes());
var request = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:8080/api/v1/customers"))
.header("Authorization", headerValue)
.GET()
.build();
在java.util软件包中的base64类的帮助下很容易完成编码。并授予对资源的访问。控制台输出
Status 200
Body [{"id":1,"name":"Joe Smith","email":"joe.smith@gmail.com",...
使用身份验证者类认证
提供凭据的第二种方法是在HTTPCLIENT对象中配置身份验证器。身份验证器是一个抽象类,知道如何获得网络连接的身份验证。 Authenticator类通过提示用户获取凭证信息(例如用户名和密码)来执行身份验证。应用程序将实现具体的子类并覆盖GetPasswordAuthentication。此功能只需用用户名和密码返回数据持有人类passwordauthentication。
代码看起来如下
var client = HttpClient.newBuilder()
.connectTimeout(Duration.ofMillis(500))
.authenticator(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"user1234", "password5678".toCharArray());
}
})
.build();
和对端点的呼叫成功如下显示了
Status 200
Body [{"id":1,"name":"Joe Smith","email":"joe.smith@gmail.com",...
概括
在这篇简短的文章中,我们看到了如何使用Java HTTP客户端API访问有担保资源。仅在几行代码中简单明了且易于设置。这是通过将授权标头添加到httprequest对象或在httpclient对象中配置Authenticator类来实现的。
将有与此系列有关的第三部分文章,我们将看到如何使用API提供的通用BodyPublisher和Bodyhandlers上传和下载文件来处理文件内容。