Java 程序无法编写完整的网页内容,但是在 SOAPUI 中,我可以看到完整的内容

Java program is not able to write complete web content, however in SOAPUI, I can see complete content

我编写了一个 Java 程序来进行简单的 HTTP get 调用并从 REST 网络服务读取内容。我包括 2 个自定义 HTTP headers 并为它们提供值。

在 SOAPUI 中,当我通过更新这 2 个 headers 进行 REST 调用时,我得到了正确的响应,但是当我在我的 Java 程序中进行相同的调用时,我得到了截断的输出。下面是我的代码:

    try {
         URL url = new URL(lnk);
         HttpURLConnection connection = (HttpURLConnection) url.openConnection();
         connection.setRequestMethod("GET");
         connection.setRequestProperty("HeaderParameter1", param1);
         connection.setRequestProperty("HeaderParamter2", param2);
         connection.setConnectTimeout(60000);
         
         InputStream is = connection.getInputStream();
         byte [] b = new byte [is.available()];
         is.read(b);
         String input = new String(b);
         System.out.println("The payload is \n"+input);
         connection.disconnect();} catch(Exception e){}

正在调用 is.available() return 可在不阻塞的情况下读取的字节数,但可能少于响应的全部内容。在 documentation for this method 中,它说:“使用此方法的 return 值来分配旨在保存此流中所有数据的缓冲区是永远不正确的。”

将整个响应读入 String 的简单方法可能是:

InputStream is = connection.getInputStream();
byte [] b = is.readAllBytes();
String input = new String(b);

这种方法有两个注意事项:

  1. new String(byte[]) 构造函数使用平台的默认字符集将字节转换为字符。对于网络协议来说,这通常不是一个好主意,因为客户端和服务器需要就字符编码达成一致。如果字符集编码始终相同,您可以对其进行硬编码,例如:new String(b, "UTF-8").
  2. 如果响应非常大,这将分配一个大字节数组。如果您对响应的处理可以以流方式编写,那么最好使用固定缓冲区大小的迭代读取,正如安德斯在他的评论中提到的那样。