Russian Qt Forum
Апрель 25, 2024, 14:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с Youtube.API через сокеты  (Прочитано 4354 раз)
100 and 80
Гость
« : Ноябрь 11, 2014, 16:20 »

Добрый вечер.

Изучаю основы сетевого программирования, с QNAM, QWebView более менее знаком, поэтому решил попробовать сделать через QTcpSocket.

Создаю сокет и соединяю слоты и сигналы:
Код:
    socket = new QTcpSocket();

    connect(socket, SIGNAL (connected()), this,SLOT(socketConnected()), Qt::DirectConnection );
    connect(socket, SIGNAL( readyRead()), this,SLOT(socketReadyRead()), Qt::DirectConnection);
    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(socketError(QAbstractSocket::SocketError)), Qt::DirectConnection);
    connect(socket, SIGNAL (disconnected()), this,  SLOT(socketDisconnected()), Qt::DirectConnection);

Делаю коннект:
Код:
    socket->connectToHost("www.googleapis.com", 443, QIODevice::ReadWrite);

Приходит сигнал connected, далее посылаю запрос GET, как в примере https://developers.google.com/youtube/v3/sample_requests со своим ключом:
Код:
    QString str("GET https://www.googleapis.com/youtube/v3/search?part=snippet&q=Qt+examples"\
                "&type=video"\
                "&videoCaption=closedCaption"\
                "&key=ЗДЕСЬ КЛЮЧ");

    socket->write(str.toStdString().c_str());

Итог дисконнект - сигнал readyRead не приходит, и в статистике использования в google ничего нет - запрос не проходит. Тот же запрос через браузер проходит и получаю ответ.
Записан
vulko
Гость
« Ответ #1 : Ноябрь 11, 2014, 17:23 »

Цитировать
GET {base-URL}/channels?part=contentDetails
                       &mine=true

Это... несколько утрированное, я бы даже сказал схематичное, представление HTTP запроса Улыбающийся

Означает что нужно сделать HTTP-GET запрос на http://youtube.com/channels?part=contentDetails&mine=true, а не тупо в сокет чето запихать.

http://developer.nokia.com/community/wiki/Creating_an_HTTP_network_request_in_Qt

https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#newwindow=1&q=qt%20http%20get%20request&qscrl=1
Записан
100 and 80
Гость
« Ответ #2 : Ноябрь 11, 2014, 18:49 »

А, все разобрался. Вот так работает и заменить надо было QTcpSocket на QSslSocket:
Код:
QString str("GET /youtube/v3/search?part=snippet&q=YouTube+Data+API&type=video&videoCaption=closedCaption&key=КЛЮЧ HTTP/1.1\r\nHost: www.googleapis.com\r\n\r\n");

Теперь еще такой вопрос - получая ответ есть возможность как-то заголовки разобрать автоматически или только как строку?
Хотел ответ конвертировать в QJsonDocument, но нужно отбросить заголовки у QByteArray.
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #3 : Ноябрь 11, 2014, 21:15 »

Например, ищи в полученном QByteArray позицию "'\r\n\r\n" и отсекай.
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #4 : Ноябрь 11, 2014, 21:40 »

А, все разобрался. Вот так работает и заменить надо было QTcpSocket на QSslSocket:
Код:
QString str("GET /youtube/v3/search?part=snippet&q=YouTube+Data+API&type=video&videoCaption=closedCaption&key=КЛЮЧ HTTP/1.1\r\nHost: www.googleapis.com\r\n\r\n");

Теперь еще такой вопрос - получая ответ есть возможность как-то заголовки разобрать автоматически или только как строку?
Хотел ответ конвертировать в QJsonDocument, но нужно отбросить заголовки у QByteArray.
Не надо так извращаться, используйте QNetworkAccessManager/QNetworkRequest/QNetworkReply, как vulko сказал выше.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 22.