Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка 302 в ответ, а через браузер работает 
:(
    Опции темы
i_SweP
Дата 25.6.2011, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



На сайте ajax'ится панель навигации отсюда http://maps.2gis.ru/spb/rubric-list/. Пытаюсь её сграбить
Когда отрываю в браузее, всё ОК. Обмен заголовков такой:

Код

GET http://maps.2gis.ru/spb/rubric-list/ HTTP/1.1
Host: maps.2gis.ru
Proxy-Connection: keep-alive
Referer: http://maps.2gis.ru/spb/
X-Http-Request: DGAjax
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/11.04 Chromium/12.0.742.91 Chrome/12.0.742.91
Accept: */*
Accept-Encoding: sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

---------------И ответ:

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 25 Jun 2011 14:44:19 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Keep-Alive: timeout=30
X-Powered-By: PHP/5.2.9-1


Но когда отсылаю тоже самое (из NetTool 4.7.2) приходит странный ответ:
Код

HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Sat, 25 Jun 2011 14:47:27 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=30
X-Powered-By: PHP/5.2.9-1
Location: /cityselect/


Причём при попытке обратится к http://maps.2gis.ru/cityselect/ приходит такой же ответ.

Java прога вовсе зависает на считывании ответа из потока. Через минуту выкидвает java.net.SocketException: Connection reset
На всякий случай код:
Код

byte buf[] = new byte[64 * 1024];
Socket s = openSocket( request );
s.getOutputStream().write( request.getBytes() );

InputStream is = s.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();

int len = 1;
while ( len > 0 )
{
    len = is.read( buf );
    if ( len > 0 )
    {
        baos.write( buf, 0, len );
    }
}
 

Что делать, как скачать эту страницу, и почему только браузер нормально открывает её сразу?

Это сообщение отредактировал(а) i_SweP - 26.6.2011, 14:05
PM MAIL   Вверх
inmate
Дата 27.6.2011, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 16.11.2008

Репутация: нет
Всего: 1



Обязательно через сокеты??

Можно так:
Код

public static void main(String[] args) throws IOException {
        URL url = new URL("http://maps.2gis.ru/spb/rubric-list/");
        URLConnection connection = url.openConnection();

        Scanner scanner = new Scanner(connection.getInputStream());
        StringBuilder builder = new StringBuilder();
        while (scanner.hasNext()) {
            builder.append(scanner.next());
        }
        scanner.close();
}

PM MAIL   Вверх
LSD
Дата 27.6.2011, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15717
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 537



302 это не ошибка, это редирект. Судя по адресу куда тебя редиректят: Location: /cityselect/ тебя нужно выбрать город. Когда ты открываешь страницу браузером, он либо по кукам определяет ранее выбранный город, или отправляет на страницу выбора города.

Реализация HTTP протокола руками, нудное и муторное занятие, возьми готовую реализацию, тот же HttpClient.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
i_SweP
Дата 27.6.2011, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Цитата(inmate @  27.6.2011,  00:26 Найти цитируемый пост)
Обязательно через сокеты??

Не smile Я уже переписал под url, оно заработало, но всё-равно вопрос остаётся по http части.. Оно может и выбирается по кукам, я пробовал их передавать, пробовал в браузере отключать куки. В первом случае такой же результат, во-втором, в браузере всё-равно нормально работает без кук. 

Цитата(LSD @  27.6.2011,  09:46 Найти цитируемый пост)
 Судя по адресу куда тебя редиректят: Location: /cityselect/ тебя нужно выбрать город.

Он меня даже с этого адреса туда же опять редиректит

Цитата(LSD @  27.6.2011,  09:46 Найти цитируемый пост)
Реализация HTTP протокола руками, нудное и муторное занятие, возьми готовую реализацию, тот же HttpClient. 

Была мысль, что где-то есть готовая реализация, но я не знал, как она называется. И ещё на пороге обнаружилось, что через url вполне нормально работает. Но теперь буду знать, что есть HttpClient, спасибо.

Вопрос остаётся с теоретической точки зрения - почему браузер и HttpURLConnection нормально обрабатывают страницу, а в ручную посланный такой же запрос получает левый редирект

Для тех, кто столкнётся  с этой маленькой бедой, такой код заработал у меня:

Код

BufferedReader reader = null;
StringBuilder stringBuilder;

try
{
    URL url = new URL( urlString );
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod( "GET" );
    connection.setReadTimeout( 15 * 1000 );
    connection.connect();

    reader = new BufferedReader( new InputStreamReader( connection.getInputStream() ) );
    stringBuilder = new StringBuilder();

    String line = null;
    while ( (line = reader.readLine()) != null )
    {
        stringBuilder.append( line + "\n" );
    }
    return stringBuilder.toString();

} catch (IOException e)
{
    System.err.println( "Error opening socket" );
    throw new RuntimeException( e );
} finally
{
    try
    {
        if ( reader != null )    reader.close();
    } catch (IOException ioe)
    {
        ioe.printStackTrace();
    }
}


inmate
Воистину, библиотека io в java огромна. Твой код тоже попробую (он наглядней smile )

Это сообщение отредактировал(а) i_SweP - 27.6.2011, 11:41
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0665 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.