【问题标题】:Java http GET keeps getting a nullJava http GET 不断得到空值
【发布时间】:2026-01-31 22:50:01
【问题描述】:

我能够在 Postman 中成功执行这个 GET 命令,它返回我需要的各种标题。我对第一个 GET 使用基本身份验证:

获取http://SERVER/qcbin/api/authentication/sign-in

我正在尝试在 Java 中实现这一点,但没有任何结果。我一直得到一个空值。

谁能告诉我我做错了什么?我无法弄清楚我的错误。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;


public class test2 {

public static void main(String[] args) {

    try {
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("myproxy", 8080));
        URL url = new URL ("http://SERVER/qcbin/api/authentication/sign-in");  

        byte[] credBytes = ("jsmith" + ":" + "abc123").getBytes();

        Base64.Encoder base64Encoder = Base64.getEncoder().withoutPadding();
        String encoding = base64Encoder.encodeToString(credBytes);

        HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy);
        connection.setRequestMethod("GET");
        connection.setDoOutput(true);
        connection.setRequestProperty  ("Authorization", "Basic " + encoding);

内容在下一行之后设置为空。

        InputStream content = (InputStream)connection.getInputStream();
        BufferedReader in   = 
            new BufferedReader (new InputStreamReader (content));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }
    } catch(Exception e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 您是否在运行 java 代码的机器上进行了邮递员测试?您可以发布您的请求的curl -vvv 吗?
  • 你为什么打电话给setDoOutput(true)?在这种情况下,连接是否首先需要一些输出?
  • @RC - 是的,同一台机器。我对java很陌生。我对 curl 不熟悉。
  • @StefanHaustein - 老实说,我不知道。这是我第一次通过 Java 进行 http GET。我第一次尝试把它放在一起。有没有更好的办法?
  • 你和SERVER之间有防火墙吗?邮递员会遵守您的代理设置,但 Java 会不知道它们......

标签: java


【解决方案1】:

在以下代码中,您正在从流中读取一行:

while ((line = in.readLine()) != null) {
    System.out.println(line);
}

您是否从未从流中获得“新行”字符,这意味着服务器不会向您发送以换行符结尾的数据?因此,当您的流中没有更多数据时,in.readLine() 仍在等待该行尾字符?

尝试将该代码替换为:

     // reads to the end of the stream 
     while((value = br.read()) != -1)
     {
        // converts int to character
        char c = (char)value;

        // prints character
        System.out.println(c);
     }

编辑:来自 BufferedReader javadoc:

公共字符串 readLine() throws IOException 读取一行文本。

一行被认为是由换行符('\n')中的任何一个终止,a 回车 ('\r'),或回车后紧跟 换行。

返回:包含行内容的字符串,而不是 包括任何行终止字符,或 null 如果 已到达流

【讨论】:

  • 这不可能是问题——在任何情况下,当到达流的末尾时,readLine() 都会返回 null。
  • 当然,鉴于流已刷新并关闭
最近更新 更多