1. Что за перенаправление?
Редирект, его нужно обрабатывать вручную. то есть формировать урл и делать новый гет запрос на этот урл
2. Пришли куки. Как их использовать?Авторизация вообще состоялась?
QNetworkAccessManager *qnam = new QNetworkAccessManager;
QNetworkCookieJar *cookieJar = new QNetworkCookieJar(qnam);
qnam->setCookieJar(cookieJar);
все о проблеме с куками можно забыть, они будут обрабатываться объектом cookieJar
раз сервер назначил куки и сделал переадресацию, можно полагать что авторизация состоялась. но это зависит от сервера где как проходит авторизация. можно проверить через сниффер как проходит авторизация в браузере.
3.Ну и собственно что сделать какие мои дальнейшие действия? Как мне корректно выполнить запрос после авторизации, что б получить эти самые данные(распарсить я смогу сам)?
во-первых, назначить QNetworkCookieJar
во-вторых, обработать все редиректы (сделать на них гет запрос)
в-третих сделать запрос на
http://solaris-dev.com.ua:8080/SolarisProvider/hl/workplaces, сохранить reply->readAll() в переменную и парсить ее.
п.с. делать множественные асинхроннные запросы через QNetworkAccessManager тот еще гемор, поэтому рекомендую сделать синхронную обработку и через нее делать запросы.
типа такой
C++ (Qt)
QEventLoop loopGet;
QTimer::singleShot(60000, &loopGet, SLOT(quit())); // таймаут минута на запрос
reply = qnam->get(request);
reply->ignoreSslErrors();
connect(reply, SIGNAL(finished()), &loopGet, SLOT(quit()));
loopGet.exec();
if (reply->rawHeader("Content-Encoding").contains("gzip")) {
QString answer = uncompressBa(reply->readAll());
} else {
QString answer = reply->readAll();
}
//#include "C:/Qt/Qt5.2.0/5.2.0/Src/qtbase/src/3rdparty/zlib/zlib.h"
QByteArray Http::uncompressBa(const QByteArray &data) const
{
if (data.size() <= 4) {
qWarning("uncompressBa: Input data is truncated");
return QByteArray();
}
QByteArray result;
int ret;
z_stream strm;
static const int CHUNK_SIZE = 1024;
char out[CHUNK_SIZE];
/* allocate inflate state */
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = data.size();
strm.next_in = (Bytef*)(data.data());
ret = inflateInit2(&strm, 15 + 32); // gzip decoding
if (ret != Z_OK)
return QByteArray();
// run inflate()
do {
strm.avail_out = CHUNK_SIZE;
strm.next_out = (Bytef*)(out);
ret = inflate(&strm, Z_NO_FLUSH);
Q_ASSERT(ret != Z_STREAM_ERROR); // state not clobbered
switch (ret) {
case Z_NEED_DICT:
ret = Z_DATA_ERROR; // and fall through
case Z_DATA_ERROR:
case Z_MEM_ERROR:
(void)inflateEnd(&strm);
return QByteArray();
}
result.append(out, CHUNK_SIZE - strm.avail_out);
} while (strm.avail_out == 0);
// clean up and return
inflateEnd(&strm);
return result;
}