【问题标题】:How to use HTTP GET Requests in Java? [duplicate]如何在 Java 中使用 HTTP GET 请求? [复制]
【发布时间】:2021-06-24 13:18:05
【问题描述】:

我正在尝试将现有的 python 脚本重新编码为 Java。 它包括以下行:

r = requests.get('https://{}/redfish/v1/{}'.format(ip, query), auth=('ADMIN', 'ADMIN'), verify=False)

我在 Python 方面没有太多经验,也没有自己编写脚本。到目前为止,我只能弄清楚它的作用,但不知道如何使用 Java 来复制它。

如果有人能指出我正确的方向,那就太棒了。

谢谢!

【问题讨论】:

  • 您是否尝试在 Google 上输入问题的标题? first result 包含您正在寻找的内容。
  • 这能回答你的问题吗? HTTP GET request in java
  • @MatteoNNZ 我有,但似乎我的关键字已关闭!非常感谢!
  • 好吧,我只是复制粘贴了你的标题,所以没有你的关键字很好:)

标签: java python get httprequest


【解决方案1】:

首先,阅读this tutorial on the java HTTP client。 (注意,它需要 jdk11 或更高版本)。

从那里开始应该相当简单; .format() 只是用提供的 ip 和查询部分替换 {}。 auth 部分更有趣。验证部分大概意味着“无论如何,忘记 SSL”。

在“管理员”和“忽略 SSL 问题”的密码之间,这段代码尖叫着“你大约需要 2 周的时间才能得到你的盒子”,也许你应该比这更认真地对待安全性。

无论如何,java 领域中的等价物更复杂,因为 java 故意不意味着“禁用 ssl”是一个随意的一次性举动,不像 python 只是把火箭筒交给你而不问任何问题。

Here is a tutorial on how to do basic http auth with the http client.

要正确地射击你的脚并确保脚完全死掉,你需要创建一个 SSL 上下文,它什么都不做,只是默默地接受所有证书,即使是有人试图破解你的系统。然后将.sslContext 传递给HttpClient.builder()

Here is an example of someone firing this bazooka.

【讨论】:

  • 太棒了,谢谢!关于安全性,我会尝试看看是否有更好的方法。虽然,这个脚本是由一位同事编写的,并在本地网络上执行以从我们为客户端设置的服务器获取信息(因此“ADMIN/ADMIN”登录,服务器甚至没有操作系统)并将这些信息写入文本文件。对此,你还觉得这样不安全吗?因为我真的很喜欢我的脚,不打算带火箭筒去上班:D
  • 我一直在查看您链接的教程,这些教程使用的大多数课程似乎都不可用。猜猜我已经用 JDK 16 杀了我的脚?
  • @Korlimann 恰恰相反。我链接到的教程是“新的”烘焙到 Java 中的 HTTP 客户端;它是在 JDK11 中引入的。如果它们“不可用”,那么您使用的是 JDK8,而您只是认为您使用的是 16 版。如果您真的使用的是 16 版,那么这些都可用。
  • 有趣的是,根据 IntelliJ 的说法,我似乎使用的是 openjdk-16.0.1。我尝试添加本地安装的 java 16.0.1,但仍然没有名为“CredentialsProvider”或“UsernamePasswordCredentials”的类 HttpClient/Response 可以正常工作,但如果没有这些类,我找不到如何进行身份验证。
【解决方案2】:

首先,您可以使用String.format 进行格式化:

String url=String.format("https://%s/redfish/v1/%s",ip,query);

如果你愿意,你也可以使用MessageFormat

对于连接,您可以创建一个URL-object 并创建一个URLConnection(在您的情况下为HttpsURLConnection),然后打开一个InputStream 以获取之后的响应:

HttpsURLConnectioncon=(HttpsURLConnection)new URL(url).openConnection();
try(BufferedInputStream is=new BufferedInputStream(con.openStream()){
    //...
}

为了进行身份验证,您可以查看this tutorial

String auth =  "ADMIN:ADMIN";
byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(StandardCharsets.UTF_8));
//Get the HttpURLConnection
con.setRequestProperty("Authorization", authHeaderValue);
//Connect/open InputStream

如果你真的想禁用验证,你可以创建你自己的HostnameVerifier,它允许一切,但强烈建议不要这样做,因为这允许中间人攻击,因为你基本上禁用HTTPS 的安全性

con.setHostnameVerifier((hostname,sslSession)->true);

所有组合起来,它可能看起来像这样:

String url=String.format("https://%s/redfish/v1/%s",ip,query);

String auth =  "ADMIN:ADMIN";
byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(StandardCharsets.UTF_8));
String authHeaderValue = "Basic " + new String(encodedAuth);

HttpsURLConnection con=(HttpsURLConnection)new URL(url).openConnection();

con.setRequestProperty("Authorization", authHeaderValue);
con.setHostnameVerifier((hostname,sslSession)->true);//vulnerable to man in the middle attacks

try(BufferedInputStream is=new BufferedInputStream(con.openStream()){
    //...
}

【讨论】:

  • 您建议使用过时且设计不佳的 API。
  • 谢谢!我尝试使用您的代码作为基础,但似乎 HttpsUrlConnection 类和方法 encodeBase64() 都不存在。可能是因为我使用的是JDK16吗?编辑:看来 HttpURLConnection 是 HttpsUrlConnection 的新类名?
  • Base64.encodeBase64 不存在于任何事物中。这个答案是gobbledygook。 HttpsURLConnection 存在(注意 s!)。 HttpsUrlConnection 不存在,也从来没有。这个答案可能在作者的脑海中被写下来,作者记错了。
  • 感谢您的指出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2021-08-04
  • 2010-11-24
  • 2016-07-08
  • 2012-03-13
  • 2023-04-02
相关资源
最近更新 更多