Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > URL отдает разные данные IE и Java


Автор: _Y_ 26.10.2010, 22:03
Пытаюсь сделать небольшую програмку обращающуюся к открытой базе данных. На одном из шагов получаю разницу между запросом из адресной строки IE и запросом из программы. Вот предельно упрощенная программа запроса:
Код

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;


public class T {
    
    private static final String 
    url_1 = "http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?mode=Undef&name=Acartia+bifilosa&srchmode=1&keep=1&a=Go&lvl=3&p=has_linkout&p=mapview&p=genome_blast",
    url_2 = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=Nucleotide&cmd=Search&dopt=DocSum&term=txid544687[Organism:noexp]";

    public static void main(String[] args) {
        
        try    {
            
            URL url;
            url = new URL(url_1);
//            url = new URL(url_2);
            
            URLConnection conn = url.openConnection ();

            BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            BufferedWriter bw = new BufferedWriter(new FileWriter(new File("C:/t.htm")));

            String line;
            while ((line = rd.readLine()) != null) {
                bw.write(line);
                bw.newLine();
            }
            
            bw.close();
            rd.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


url_1 вставленный в адресную строку броузера возвращает правильную страницу. Программа делает то же самое - пишет правильную страницу в файл.

url_2 правильную страницу позволяет получить только в броузере. Программа же пишет в файл совсем другую страницу. 

Что я делаю неправильно? Спасибо!

Автор: Vasay 26.10.2010, 23:16
_Y_, 

Первое что бросилось в глаза - редирект.

Цитата

HTTP/1.1 301 Moved Permanently
Date: Tue, 26 Oct 2010 20:18:55 GMT
Server: Apache
Location: http://www.ncbi.nlm.nih.gov/sites/entrez?db=nucleotide&cmd=Search&dopt=DocSum&term=txid544687%5BOrganism%3Anoexp%5D
Content-Type: text/plain
Set-Cookie: 1XQLhPMlNtZ0pjeF5q1ZcD2-yhFfKiKickrhRPf_TOC-dd2t5V8TCCyqe39PyCWCG_mrJgtu7yRQK@39695D65CC7378D1_0098SID
Content-Length: 0
Connection: close



Возможно, поможет
Код

HttpURLConnection.setFollowRedirects(true);




А вообще расширение к фаерфоксу "Live HTTP Headers" вам в помощь.

Автор: Skipy 27.10.2010, 12:27
Цитата(_Y_ @ 26.10.2010,  22:03)
url_2 = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=Nucleotide&cmd=Search&dopt=DocSum&term=txid544687[Organism:noexp]";

Что я делаю неправильно? Спасибо!

Это не Вы.

http://tools.ietf.org/rfc/rfc3986.txt

Код

query         = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                / "*" / "+" / "," / ";" / "="


Квадратные скобки не входят в список разрешенных в query символов (они входят в gen-delims). Скорее всего, Java просто обрезает хвост при запросе. Поставьте любой HTTP-монитор и посмотрите, что точно посылается.

Автор: _Y_ 27.10.2010, 17:34
Vasay, не помогает, к сожалению.

Skipy, понятно. Еще бы идею как с проблемой бороться smile 

Автор: Vasay 27.10.2010, 17:41
Цитата

Skipy, понятно. Еще бы идею как с проблемой бороться


Цитата

txid544687[Organism:noexp] 


Вот это прогнать через URL Encoder

http://download.oracle.com/javase/6/docs/api/java/net/URLEncoder.html

Автор: _Y_ 27.10.2010, 18:38
Vasay, прогоняю через энкодер. Пошлучаю вот такую  строку
Код

url_2 = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=Nucleotide&cmd=Search&dopt=DocSum&term=txid544687%5BOrganism%3Anoexp%5D";
Эффекта на результат никакого. Та же разница между результатами запроса из IE и Java.

Автор: Skipy 27.10.2010, 19:30
Вы знаете, может я не специалист, но разницы между запросами из Opera и Java я не увидел. Во всяком случае визуальной. И там и там 9 результатов в поиске, идентичных.

Автор: _Y_ 29.10.2010, 14:10
Skipy, интерррресссно. Тогда вопрос а как Вы мою программу запускаете?

Если я подаставляю эту строку в качестве адреса в IE или GoogleChrome - выдает как и надо 9 результатов поиска. Если же запускаю эту мою Java программу из-под Eclipse или просто из командной строки (откомпиллированную в том же Eclipse), рузультат куда-как печальнее.

Автор: Skipy 29.10.2010, 16:06
Цитата(_Y_ @ 29.10.2010,  14:10)
Skipy, интерррресссно. Тогда вопрос а как Вы мою программу запускаете?

Я не Вашу программу запускаю, у меня ее естественным образом нет. smile Я взял Вашу ссылку.

Код
    public static void main(String[] args) throws Exception{
        URL url = new URL("http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=Nucleotide&cmd=Search&dopt=DocSum&term=txid544687%5BOrganism%3Anoexp%5D");
        byte[] buffer = new byte[16384];
        InputStream is = url.openStream();
        FileOutputStream fos = new FileOutputStream("content.html");
        while (true){
            int res = is.read(buffer);
            if (res == -1)
                break;
            if (res > 0){
                fos.write(buffer, 0, res);
            }
        }
        fos.flush();
        fos.close();
        is.close();
    }


Ну и соответственно, сохраняю то, что получил в Opera, открываю два локальных файла и смотрю. Они без CSS, естественно, но результаты хотя бы одинаковые. Хотя файлы, конечно разные, причем в каких-то частях существенно. Я их в архиве прикрепил, content.html - из Java, content1.html - из Opera

Автор: _Y_ 30.10.2010, 12:41
Цитата(Skipy @  29.10.2010,  16:06 Найти цитируемый пост)
Я не Вашу программу запускаю, у меня ее естественным образом нет
 А вот и противоестественно - она в моем первом посте smile 

За ответ же большое спасибо. Теперь я, кажется, въезжаю. Сервер, скорее всего, возвращает одно и то же, а вот при сохранении страницы в начало добавляется (или не добавляется) огромная структура с деревом линков к ресурсам вебсайта. Я не подумал сначала сохранить из IE, а потом открыть сохраненный файл. 

Получается, что IE и Java сохраняют с деревом линков, хоть IE это дерево и не показывает если страница получена с оригинального сервера, а не открыта из сохраненного файла. Попробовал Chrome - сохраняет страницу именно в том виде, в котором ее показывает - видимых отличий между оригинальной и сохраненной страницей нет.

Значит проблема не в Java, а, скорее всего, в метакомандах самой страницы. Ну и ладно. Теперь можно продолжать работать (просто принимать во внимание наблюдаемый эффект).

Еще раз спасибо! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)