Чтение содержимого URL в Java - проблемы с перенаправлением - PullRequest
2 голосов
/ 10 ноября 2009

Когда я выполняю следующую Java-программу, иногда я получаю пустой ответ , иногда я получаю реальное (перенаправленное) содержимое .

ByteArrayOutputStream output = new ByteArrayOutputStream();
URL url = new URL( "https://stackoverflow.com/questions/84629" );
IOUtils.copy( url.openStream(), output );
System.out.println( output.toString() );

URL https://stackoverflow.com/questions/84629 - это перенаправление на Какой ваш любимый мультфильм "программист"? .

Я просмотрел другие вопросы SO и попытался использовать предложенный HttpUrlConnection, но результат был тот же. Код ответа всегда 200, но иногда есть правильный вывод HTML, иногда это просто пустая строка.

Можете ли вы объяснить, что здесь происходит?


EDIT

Вот код без общих Apache:

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

Ответы [ 3 ]

2 голосов
/ 10 ноября 2009

Раньше у меня были проблемы с созданием URL-адресов, как в примере, который вы опубликовали, и лучший способ, с помощью которого я нашел решение этой проблемы, - это создать URI , а затем создать URL-адрес примерно так:

URL url = uri.toUrl()

Я не совсем уверен, что ваша проблема такая же, как у меня, но когда я создавал URL, как в вашем примере, он не каждый раз кодировался правильно, что иногда вызывало ошибки, но использование URI исправляло его для я.

0 голосов
/ 19 декабря 2009

Я думаю, что @ carl-smotricz сказал: «Вы, вероятно, сталкиваетесь со спам-фильтром или чем-то в этом роде».

0 голосов
/ 10 ноября 2009

У меня были похожие проблемы, и мне пришлось самому использовать HttpURLConnection. Я не помню, чтобы у вас были проблемы с HttpURLConnection, которые вы описали. Этот код прямо здесь выполняет свою работу (выводит его на экран, но вы можете изменить его так, как вам нужно)

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());
}
...