首页 > 解决方案 > Java:执行 HTTP REST GET 调用而不读取响应

问题描述


我处于向 JVM 服务器发送 HTTP GET 的场景中。此 HTTP GET 的目的是停止远程 JVM(它将在 Kubernetes Pod 中自动重启)。

我观察到的是,当使用 cURL 发送请求时,它按预期工作:

$ curl namespace.192.168.42.204.nip.io/rest

但是,当在 Java 中发送 HTTP GET 时,它会失败,因为它会尝试读取为空的响应:

private String sendGet(String url) throws Exception {

    URL obj = new URL(url);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();

    // optional default is GET
    con.setRequestMethod("GET");

    int responseCode = con.getResponseCode();

    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }

    in.close();

    return "SUCCESS";

}

事实上,当我尝试读取 responseCode 时,会抛出一个异常:

java.net.UnknownHostException: namespace.192.168.42.204.nip.io/rest
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1220)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:984)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)

是否可以在 Java 中模拟 cURL 行为?需要在不读取响应的情况下发送 GET 请求。你知道在 Java 中有什么方法吗?

标签: java

解决方案


您应该在创建URL. 使用下面的 Java 11 代码:

new URL("namespace.192.168.42.204.nip.io/rest");

将导致以下结果MalformedURLException

java.net.MalformedURLException: no protocol: namespace.192.168.42.204.nip.io/rest

根据手册页,与 Java 不同curl的是,它会在幕后为您完成:

如果您指定的 URL 不带 protocol:// 前缀,curl 将尝试猜测您可能想要的协议。然后它将默认使用 HTTP,但会尝试基于常用主机名前缀的其他协议。例如,对于以“ftp”开头的主机名。curl 会假设你想使用 FTP。


推荐阅读