Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> POST запрос, Отправить POST запрос 
:(
    Опции темы
rudolfninja
Дата 6.12.2015, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



Ребята, приветствую.

Т.к. в теме сетевого программирования не совсем силен, то вопросы могут показаться глупыми.
В общем, проблема такая: мне надо из приложения отправлять post запрос на www.kinopoisk.ru с названием фильма, информацию о котором мне надо найти. А в ответ получить картинку фильма, год выпуска, режиссера, актеров и жанр.

Собственно, в чем пока что вопросы:
1) Как сформулировать этот запрос? Куда именно подставлять название фильма?
2) На кинопоиске если ввести название фильма (например Психо), то он покажет целый список результатов. Как в этом случае получить фильм, который первый в списке?

Спасибо.
PM MAIL Skype   Вверх
volatile
Дата 6.12.2015, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Вообще это чистый  smile конечно smile 
Но я чуток в теме, поэтому отвечу (а модераторы пусть переносят  smile )

Цитата(rudolfninja @  6.12.2015,  12:09 Найти цитируемый пост)
POST запрос
там не нужен POST, сойдет обычный GET

Цитата(rudolfninja @  6.12.2015,  12:09 Найти цитируемый пост)
1) Как сформулировать этот запрос? Куда именно подставлять название фильма?

Код

"http://www.kinopoisk.ru/index.php?first=yes&what=&kp_query=" + urlencode(query);

Цитата(rudolfninja @  6.12.2015,  12:09 Найти цитируемый пост)
(например Психо
Код

http://www.kinopoisk.ru/index.php?first=yes&what=&kp_query=%D0%9F%D1%81%D0%B8%D1%85%D0%BE


Цитата(rudolfninja @  6.12.2015,  12:09 Найти цитируемый пост)
2) На кинопоиске если ввести название фильма (например Психо), то он покажет целый список результатов. Как в этом случае получить фильм, который первый в списке?

Ну собстенно, вышеприведенный запрос так и делает.




Это сообщение отредактировал(а) volatile - 6.12.2015, 12:56
PM MAIL   Вверх
rudolfninja
Дата 6.12.2015, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



Код

const char QUERY[] = "GET http://www.kinopoisk.ru/index.php?first=yes&what=&kp_query=%D0%9F%D1%81%D0%B8%D1%85%D0%BE";


Если отправить такой запрос, то вы итоге зависаю на получении ответа. Если без слова "GET", то получаю вот такой ответ:
Цитата

HTTP/1.1 400 Bad Request
Server: nginx/1.6.2
Date: Sun, 06 Dec 2015 09:58:37 GMT
Content-Type: text/html
Content-Length: 172
Connection: close


Переделал запрос так:
Код

const char HEAD_REQUEST_PART1[] =
{
    "GET http://www.kinopoisk.ru/index.php?first=yes&what=&kp_query=%D0%9F%D1%81%D0%B8%D1%85%D0%BE HTTP/1.1\r\n"            
    "Host: "                        
};
const char HEAD_REQUEST_PART2[] =
{
    "\r\n"                        
    "Connection: close\r\n"        
    "\r\n"                            
};


Потом отправляю его:

Код

// Отправляем запрос part 1
        if (send(hSocket, HEAD_REQUEST_PART1, sizeof(HEAD_REQUEST_PART1)-1, 0) == SOCKET_ERROR)
            throw HeadReqException("failed to send data.");

        // Отправляем имя хоста
        if (send(hSocket, pServername, strlen(pServername), 0) == SOCKET_ERROR)
            throw HeadReqException("failed to send data.");

        // Отправляем запрос part 2
        if (send(hSocket, HEAD_REQUEST_PART2, sizeof(HEAD_REQUEST_PART2)-1, 0) == SOCKET_ERROR)
            throw HeadReqException("failed to send data.");


В итоге такой ответ:
Цитата

HTTP/1.1 302 Found
Server: nginx/1.6.2
Date: Sun, 06 Dec 2015 10:07:56 GMT
Content-Type: text/html; charset=windows-1251
Content-Length: 0
Connection: close
Set-Cookie: PHPSESSID=f1043ff5ad06e75836f034c4cf673106; path=/; domain=kinopoisk
.ru; HttpOnly
Expires: 0
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Last-Modified: Sun, 06 Dec 2015 10:07:55 GMT
Set-Cookie: last_visit=2015-12-06+13%3A07%3A56; expires=Wed, 20-Jan-2016 10:07:5
6 GMT; path=/; domain=.kinopoisk.ru
Location: http://error.kinopoisk.ru/?ht=4


Это сообщение отредактировал(а) rudolfninja - 6.12.2015, 13:08
PM MAIL Skype   Вверх
volatile
Дата 6.12.2015, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(rudolfninja @  6.12.2015,  12:59 Найти цитируемый пост)
const char QUERY[] = "GET http://www.kinopoisk.ru/index.php?first=ye...0%BE";
Если отправить такой запрос, то вы итоге зависаю на получении ответа. Если без слова "GET", 

rudolfninja, GET запрос, это просто ссылка
Вот она
Открывается у вас в браузере?

Если да, то тогда в чем проблема?
Ваша программа может открывать ссылки?? 

PM MAIL   Вверх
rudolfninja
Дата 6.12.2015, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



Цитата(volatile @  6.12.2015,  13:08 Найти цитируемый пост)
Открывается у вас в браузере?

Открывается, но когда отправляю запрос программно, то вылетает ошибка, типа сильно много запросов с моего ip.

Моя программа получает ответ на запрос.
PM MAIL Skype   Вверх
feodorv
Дата 6.12.2015, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(rudolfninja @  6.12.2015,  12:59 Найти цитируемый пост)
        // Отправляем имя хоста

Интересно, какое именно имя хоста Вы туда отправляете  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volatile
Дата 6.12.2015, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(rudolfninja @  6.12.2015,  12:59 Найти цитируемый пост)
{
    "GET http://www.kinopoisk.ru/index.php?first=ye...%B8%D1%85%D0%BE HTTP/1.1\r\n"            
    "Host: "                        
};

ну там же не так, а как-то так
Код

    "GET /index.php?first=yes&what=&kp_query=%D0%9F%D1%81%D0%B8%D1%85%D0%BE HTTP/1.1\r\n"            
    "Host: www.kinopoisk.ru\r\n"




PM MAIL   Вверх
rudolfninja
Дата 6.12.2015, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



Цитата(volatile @  6.12.2015,  14:18 Найти цитируемый пост)
ну там же не так, а как-то так

Ну так я потом исправился.
PM MAIL Skype   Вверх
feodorv
Дата 6.12.2015, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(rudolfninja @  6.12.2015,  16:31 Найти цитируемый пост)
Ну так я потом исправился. 

Так каков в итоге HTTP-запрос?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
rudolfninja
Дата 6.12.2015, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



Код

const char HEAD_REQUEST_PART1[] =
{
    "GET http://www.kinopoisk.ru/index.php?first=yes&what=&kp_query=%D0%9F%D1%81%D0%B8%D1%85%D0%BE HTTP/1.1\r\n"            
    "Host: www.kinopoisk.ru\r\nConnection: close\r\n\r\n"                        
};

PM MAIL Skype   Вверх
feodorv
Дата 6.12.2015, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Значит, на сайте стоит какая-то защита. Стер все свои куки. Браузер отправил такой запрос:
Цитата

GET /index.php?first=no&what=&kp_query=%EC%E8%F1%F1%E8%FF HTTP/1.1
Host: www.kinopoisk.ru
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.kinopoisk.ru/index.php?first=no...;kp_query=1%2B1
Connection: keep-alive


Получил такой ответ:
Цитата

HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Sun, 06 Dec 2015 15:56:11 GMT
Content-Type: text/html; charset=windows-1251
Content-Length: 16914
Connection: keep-alive
Keep-Alive: timeout=60
Set-Cookie: PHPSESSID=4cc547ca883bb80a31e7b4c1075b52fe; path=/; domain=kinopoisk.ru; HttpOnly
Expires: 0
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Last-Modified: Sun, 06 Dec 2015 15:56:10 GMT
Set-Cookie: last_visit=2015-12-06+18%3A56%3A10; expires=Wed, 20-Jan-2016 15:56:10 GMT; path=/; domain=.kinopoisk.ru
Set-Cookie: tc=1; expires=Sun, 06-Dec-2015 18:22:10 GMT; path=/; domain=.kinopoisk.ru
Set-Cookie: user_country=ru; expires=Sun, 06-Dec-2015 16:56:10 GMT; path=/; domain=.kinopoisk.ru
Set-Cookie: my_perpages=%5B%5D; expires=Mon, 05-Dec-2016 15:56:10 GMT; path=/; domain=.kinopoisk.ru
Content-Encoding: gzip


Далее шла загэзипленная страница. Сильное подозрение, что сайт работает только с зазипованным html текстом.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
rudolfninja
Дата 6.12.2015, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



Цитата(feodorv @  6.12.2015,  19:10 Найти цитируемый пост)
Далее шла загэзипленная страница

То есть, в ответе было содержимое этой страницы, которое можно как-то преобразовать в нормальный вид?

Сделал такой запрос:
Код

const char HEAD_REQUEST_PART1[] =
{
    "GET /index.php?first=no&what=&kp_query=%EC%E8%F1%F1%E8%FF HTTP/1.1\r\n" 
    "Host: www.kinopoisk.ru\r\n"
    "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:42.0) Gecko/20100101 Firefox/42.0\r\n"
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
    "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3\r\n"
    "Accept-Encoding: gzip, deflate\r\n"
    "Referer: http://www.kinopoisk.ru/index.php?first=no...;kp_query=1%2B1\r\n"
    "Connection: keep-alive\r\n"
};


В итоге повисаю на функции 
Код

retval = recv(hSocket, tempBuffer, sizeof(tempBuffer)-1, 0);

Может ли это быть потому, что данные слишком большие?

UPD:
Нашел в чем проблема была. Проблема была в том, что в конце HTTP запроса надо было вставить пустую строку.

Теперь ответ нормально выводится на экран (или в файл) только если я под отладчиком прохожу все итерации цикла приема сообщений. Без отладчика ничего не выводится (ни на экран, ни в файл). Как быть в этом случае? Создавать отдельный поток? 
И еще вопрос, что храниться в этом gzip сообщении и как его расшифровать?

Это сообщение отредактировал(а) rudolfninja - 6.12.2015, 23:14
PM MAIL Skype   Вверх
rudolfninja
Дата 6.12.2015, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



feodorv, а не подскажете еще, какими средствами вы узнали, что запрос будет именно такой?
PM MAIL Skype   Вверх
feodorv
Дата 7.12.2015, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(rudolfninja @  6.12.2015,  23:46 Найти цитируемый пост)
feodorv, а не подскажете еще, какими средствами вы узнали, что запрос будет именно такой? 
С помощью Wareshark. Просто перехватил соответствующие пакеты smile 


Цитата(rudolfninja @  6.12.2015,  20:30 Найти цитируемый пост)
Без отладчика ничего не выводится (ни на экран, ни в файл). Как быть в этом случае? Создавать отдельный поток? 
Нужно смотреть код. Как-то странно это.


Цитата(rudolfninja @  6.12.2015,  20:30 Найти цитируемый пост)
Сделал такой запрос
Лучше сократить Referer до "http://www.kinopoisk.ru/" и попробовать сделать Connection "close" (с этим сайтом может и не сработать).


Цитата(rudolfninja @  6.12.2015,  20:30 Найти цитируемый пост)
что храниться в этом gzip сообщении и как его расшифровать?

Его надо распаковать, например, с помощью библиотеки zlib.


Вообще, Вам нужен анализ принятых заголовков:
  • Первый заголовок должен давать код 200
  • Заголовок Content-Type должен давать "text/html" с кодировкой (она может быть и UTF-8).
  • Наличие заголовка Content-Encoding говорит о том, что пришедшие данные обработаны, как - указано в заголовке. В таком случае очень нужен заголовок Content-Length, который говорит о том, сколько, собственно, байт запакованных данных.



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
rudolfninja
Дата 7.12.2015, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

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



Цитата(feodorv @  7.12.2015,  09:55 Найти цитируемый пост)
Нужно смотреть код

Вам нужен весь код или только того участка, где приосходит прием данных? Вечером, как буду дома, скину нужную часть кода (только сообщите, какая часть кода нужна =) )
По поводу всех остальных ваших замечаний понял. Иправлюсь.
Спасибо.
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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