Java中的HTTP客户端API:第2部分
#java #http #client

介绍

在本系列的第一部分(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上传和下载文件来处理文件内容。