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