在java中读取URL的内容-重定向问题
当我执行下面的java程序时,有时会得到空响应,有时会得到真实(重定向)内容在java中读取URL的内容-重定向问题,java,url,redirect,Java,Url,Redirect,当我执行下面的java程序时,有时会得到空响应,有时会得到真实(重定向)内容 ByteArrayOutputStream output = new ByteArrayOutputStream(); URL url = new URL( "https://stackoverflow.com/questions/84629" ); IOUtils.copy( url.openStream(), output ); System.out.println( output.toString() ); U
ByteArrayOutputStream output = new ByteArrayOutputStream();
URL url = new URL( "https://stackoverflow.com/questions/84629" );
IOUtils.copy( url.openStream(), output );
System.out.println( output.toString() );
URL是指向的重定向
我查看了其他SO问题,并尝试使用建议的HttpUrlConnection
,但结果是一样的。响应代码总是200,但有时有正确的html输出,有时只是一个空字符串
你能解释一下这里发生了什么吗
编辑 以下是没有Apache commons的代码:
ByteArrayOutputStream output = new ByteArrayOutputStream();
URL url = new URI( "https://stackoverflow.com/questions/84629" ).toURL();
InputStream openStream = url.openStream();
byte[] buffer = new byte[ 1024 ];
int size = 0;
while( (size = openStream.read( buffer ) ) != -1 ) {
output.write( buffer, 0, size );
}
System.out.println( output.toString() );
我正在使用Windows XP和Java 1.6.0_17
我使用wireshark捕获了流量: GET /questions/84629 HTTP/1.1 User-Agent: Java/1.6.0_17 Host: stackoverflow.com Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive HTTP/1.1 200 OK Cache-Control: private Server: Microsoft-IIS/7.0 Date: Tue, 10 Nov 2009 22:42:42 GMT Content-Length: 0 GET/questions/84629 HTTP/1.1 用户代理:Java/1.6.0_17 主机:stackoverflow.com 接受:text/html、image/gif、image/jpeg、*;q=.2,*/*;q=.2 连接:保持活力 HTTP/1.1200ok 缓存控制:专用 服务器:Microsoft IIS/7.0 日期:2009年11月10日星期二22:42:42 GMT 内容长度:0
我以前在创建URL时遇到过一些问题,比如您发布的示例,我发现解决这个问题的最好方法是创建一个URL,然后像这样创建URL
URL url = uri.toUrl()
我不完全确定您的问题是否与我的问题相同,但当我创建一个URL(如您的示例中所示)时,每次都没有正确编码,这在某些情况下会导致错误,但使用URI为我解决了问题。我也有类似的问题,最后不得不自己使用HttpURLConnection。我不记得你描述的HttpURLConnection有问题。这里的代码完成了这项工作(将其打印到屏幕上,但您可以根据需要进行更改)
我想这就像@carl smotricz说的:“你可能遇到了垃圾邮件过滤器之类的东西。”IOUtils是否会刷新并关闭提供的流?我尝试“手动”循环读取流。同样的结果。太棒了——我也很喜欢!去调试,马上回来…我想:这是网站。它的行为与我使用wget-O-时的行为相同。你可能遇到了垃圾邮件过滤器之类的东西。这篇文章可能对未来的读者有用,就像对我一样:这解决了我的问题。不,这不是解决办法。我试过你描述的方式,但行为是一样的。
public void connect() {
try {
String url = "http://www.stackoverflow.com",
proxy = "proxy.mydomain.com",
port = "8080";
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
HttpURLConnection connection = (HttpURLConnection)server.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
readResponse(in);
} catch(Exception e) {
e.printStackTrace();
}
}
public void readResponse(InputStream is) throws IOException {
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int result = bis.read();
while(result != -1) {
byte b = (byte)result;
buf.write(b);
result = bis.read();
}
System.out.println(buf.toString());
}