Russian Qt Forum

Qt => Работа с сетью => Тема начата: 100 and 80 от Ноябрь 11, 2014, 16:20



Название: Работа с Youtube.API через сокеты
Отправлено: 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 ничего нет - запрос не проходит. Тот же запрос через браузер проходит и получаю ответ.


Название: Re: Работа с Youtube.API через сокеты
Отправлено: vulko от Ноябрь 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


Название: Re: Работа с Youtube.API через сокеты
Отправлено: 100 and 80 от Ноябрь 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.


Название: Re: Работа с Youtube.API через сокеты
Отправлено: torwig от Ноябрь 11, 2014, 21:15
Например, ищи в полученном QByteArray позицию "'\r\n\r\n" и отсекай.


Название: Re: Работа с Youtube.API через сокеты
Отправлено: kibsoft от Ноябрь 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 сказал выше.