java - HTTP 身份验证 - Java Http 客户端缺少通过 curl 存在的标头
问题描述
我正在尝试使用 java.net.http.HttpClient 向 HTTP 端点发送一个简单的 GET。端点需要基本身份验证。很简单,我正在做每个人都在做的事情:
HttpClient httpClient = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.authenticator(new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("guest","guest".toCharArray());
}
})
.build();
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create("localhost:15672/api/overview")
.build();
HttpResponse<Void> httpResponse = httpClient.send(request, HttpResponse.BodyHandlers.discarding());
但是,这会引发 IOException“响应代码 401 缺少WWW-Authenticate 标头”。服务器最初以 401 响应,然后客户端在 Authenticator 的帮助下重新尝试请求,这对我来说并非完全不合理。标头是强制性的,如果不存在,则需要例外。
到目前为止,一切都很好。但是,当我通过 curl 执行相同的请求时,会出现标头:
> curl -i http://localhost:15672/api/overview
HTTP/1.1 401 Unauthorized
content-length: 0
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Thu, 08 Jul 2021 11:06:45 GMT
server: Cowboy
vary: origin
www-authenticate: Basic realm="RabbitMQ Management"
我在这里做错了什么?
解决方案
与此同时,我发现了问题所在:我正在联系的服务器有问题。第一个 GET 准确地返回了显示为 curl 结果的内容。Java HttpClient 正确响应并发送了第二个带有凭据的 GET。凭据错误(出于测试目的),但响应不是预期的 403,而是另一个 401,而第二个 401 响应是缺少标头的响应。
推荐阅读
- embedded-linux - Hi3516D:使用 uboot 从 NFS 引导时出现内核恐慌
- mysql - 如何打开 .exp 文件?
- android - AAR 文件中的类在 Android Studio 中不可用
- vb.net - 如果空行,Streamreader 读取下一行
- ios - 应用程序加载器/Xcode 卡在“使用 App Store 验证资产”上
- ios - 极坐标点生成函数的上界不是 2Pi 的 theta 吗?
- c# - ASP.NET MVC 根据用户角色显示 HTML
- excel - 在 Calc 中,我可以使用与另一个单元格相关的代码填充一个单元格吗?
- c - C 为空时删除链表的节点
- java - gradle和junit的间歇性并发失败