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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QHttp авторизация POST методом  (Прочитано 9803 раз)
bosfor
Гость
« : Январь 22, 2012, 00:31 »

согласно изученным примерам передаю свой запрос, но при анализе в сниффере есть различия в прекрипляемых данных. Оразец выглядит как:
Код:
...
тут идет стандартная чать заголовка
...
Content-Length: 43\r\n

Line-based text data: application/x-www-form-urlencoded
    login=1234567&passwd=1234567


а у меня получается так:
Код:
...
тут идет стандартная чать заголовка
...
Content-Length: 43\r\n

Media Type:  application/x-www-form-urlencoded (43 bytes)

как мне достичь первого варианта ?
код использую такой:
Код:
    QByteArray ba("login=1234567&passwd=1234567");

    QString url = QString("/login.php");
    header = QHttpRequestHeader("POST", url, 1, 1);
    header.setValue("Host", "site.ru");
    header.setValue("User-Agent", "Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.10) Gecko/2009042809 GranParadiso/3.0.10");
    header.setValue("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    header.setValue("Accept-Language", "ru,en-us;q=0.7,en;q=0.3");
    header.setValue("Accept-Encoding", "gzip,deflate");
    header.setValue("Keep-Alive", "115");
    header.setValue("Connection", "keep-alive");
    header.setValue("Referer", "http://site.ru");
    header.setValue("Content-Type", "aplication/x-www-form-urlencoded");
    header.setValue("Content-Length", QString(ba.length()));
    
    QHttp::ConnectionMode mode = QHttp::ConnectionModeHttp;
    http->setHost("site.ru",mode);
    http->request(header,ba);
« Последнее редактирование: Февраль 03, 2012, 13:56 от bosfor » Записан
thechicho
Гость
« Ответ #1 : Январь 22, 2012, 16:56 »

используй QNetworkAccessManager
на форуме я давал примеры как пост запрос отправлять, ищи
Записан
bosfor
Гость
« Ответ #2 : Январь 23, 2012, 13:04 »

что же получается, QHttp не содержит такого механизма ? а кто скажет в чем изюминка этих двух разных по стркутуре но одинаковых по сути запросов ??
Записан
thechicho
Гость
« Ответ #3 : Январь 23, 2012, 13:25 »

QHttp устарел.
это не запросы, а классы для работы с сетью.
запросы это гет, пост, хед и тп.
Записан
bosfor
Гость
« Ответ #4 : Январь 23, 2012, 13:40 »

QHttp устарел.
это не запросы, а классы для работы с сетью.
запросы это гет, пост, хед и тп.

да спасибо ))
я имел в виду не различие классов, а структуру пакетов сформированных QHttp и реальным приложением (чью работу я эмитирую) приведенных в первых двух кодовых вставках.
Записан
bosfor
Гость
« Ответ #5 : Январь 23, 2012, 16:44 »

да QNetworkAccessManager формирует правильное тело пакета ! )) осталось разобраться где взять заголовок ответной страницы
Записан
thechicho
Гость
« Ответ #6 : Январь 23, 2012, 19:22 »

Код
C++ (Qt)
void Functions::HTTPHEADERS(QNetworkReply *reply)
{
   if (!SHOWHEADERS) return;
 
   qDebug() << endl << reply->url();
   qDebug() << "Request headers:  ";
   QList<QByteArray> reqHeaders = reply->request().rawHeaderList();
   //QList<QByteArray> reqHeaders = request.rawHeaderList();
   foreach (QByteArray reqName, reqHeaders)
   {
       QByteArray reqValue = reply->request().rawHeader(reqName);
       //QByteArray reqValue = request.rawHeader(reqName);
       qDebug() << reqName << ": " << reqValue;
   }
   qDebug() << "Reply headers:  ";
   QList<QByteArray> reqHeadersReply = reply->rawHeaderList();
   foreach( QByteArray reqName, reqHeadersReply )
   {
       QByteArray reqValue = reply->rawHeader( reqName );
       qDebug() << reqName << ": " << reqValue;
   }
}
Записан
bosfor
Гость
« Ответ #7 : Январь 23, 2012, 22:05 »

...

Спасибо за классный пример ! Очень облегчил жизнь ))
Слышал есть у этго класса инструмен для удобной обработки печенюшек ?
Записан
thechicho
Гость
« Ответ #8 : Январь 24, 2012, 00:29 »

QNetworkAccessManager qnam;
QNetworkCookieJar *cookieJar = new QNetworkCookieJar;
qnam.setCookieJar(cookieJar);
Записан
bosfor
Гость
« Ответ #9 : Январь 24, 2012, 11:23 »

при загрузке основной страницы где внутри ее формируются печенюшки возможно посредством ява-скриптов. как можно загрузив страницу в QNetworkAccessManager выполнить ее содержимое (возможно ява-скрипты) чтобы получить на выходе требуемые печенюшки ?
... понял, что надо юзать QWebPage или QWebView. Можно ли привязать к ним свой QNetworkAccessManager для отслеживания пришедших печенюшек ?
« Последнее редактирование: Январь 24, 2012, 12:34 от bosfor » Записан
thechicho
Гость
« Ответ #10 : Январь 24, 2012, 16:41 »

можно. когда разберешься, выложи код.
я постил уже где-то свой вариант. пример авторизации на этом форуме, где выполняется джаваскрипт, а потом результат отправляется пост-запросом, ищи.
Записан
bosfor
Гость
« Ответ #11 : Январь 29, 2012, 22:43 »

Создал проект на основе QWebView.
Есть необходимость просматривать исходящие и входящие запросы со всем содержимым.
Привязал класс порожденный от QNetworkAccessManager и стал прослушивать сигнал finished(QNetworkReply*).
Как следствие получаю заголовок исходящего пакета и заголовок с телом ответного . Правда тело ответного пакета не всегда получается вытащить хотя в заголовке точно указан размер да и сниффер показывает наличие содержимого.
Мне хочется получить не только заголовок исходящего запроса но и само тело пакета, пытался переопределить функцию post(const QNetworkRequest &request, const QByteArray &data) у класса QNetworkAccessManager, но увы его обработка даже не начинается ((.
Ниже привожу проект:

windows.h
Код:
#ifndef WINDOW_H
#define WINDOW_H

#include <QMainWindow>
#include <QUrl>
#include <QWebElement>
#include <QNetworkReply>

QT_BEGIN_NAMESPACE
class QTreeWidgetItem;
QT_END_NAMESPACE

//! [Window class definition]
#include "ui_window.h"

class MyAccessManager : public QNetworkAccessManager
{
    Q_OBJECT

    virtual QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data)
    {
        emit sendMyPost(data);
        return QNetworkAccessManager::post(request,data);
    }
    signals:
            void sendMyPost(QString string);
};

class Window : public QMainWindow, private Ui::Window
{
    Q_OBJECT

public:
    Window(QWidget *parent = 0);
    void setUrl(const QUrl &url);
    MyAccessManager *maneger;
    bool RecStatus;

public slots:
    void on_webView_loadFinished();
    void getMyPost(QString string);
    void showPage(QNetworkReply *replay);

private:
    void examineChildElements(const QWebElement &parentElement,
                              QTreeWidgetItem *parentItem);

private slots:
    void on_pushButton_Pause_clicked();
    void on_pushButton_Rec_clicked();
    void on_pushButton_clicked();
};
//! [Window class definition]

#endif

window.cpp
Код:
#include <QtGui>
#include <QtWebKit>

#include "window.h"

//! [Window constructor]
Window::Window(QWidget *parent)
    : QMainWindow(parent)
{
    setupUi(this);
    maneger = new MyAccessManager;
    connect(maneger,SIGNAL(sendMyPost(QString)), this,SLOT(getMyPost(QString)));
    connect(maneger, SIGNAL(finished(QNetworkReply*)), this, SLOT(showPage(QNetworkReply*)));
    webView->page()->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
    webView->page()->setNetworkAccessManager(maneger);

    //webView->setHtml(data);
}
//! [Window constructor]

//! [set URL]
void Window::setUrl(const QUrl &url)
{   
    RecStatus = false;
    webView->setUrl(url);
}
//! [set URL]
   
//! [begin document inspection]
void Window::on_webView_loadFinished()
{
    treeWidget->clear();

    QWebFrame *frame = webView->page()->mainFrame();
    QWebElement document = frame->documentElement();

    examineChildElements(document, treeWidget->invisibleRootItem());
}
//! [begin document inspection]

//! [traverse document]
void Window::examineChildElements(const QWebElement &parentElement,
                                  QTreeWidgetItem *parentItem)
{
    QWebElement element = parentElement.firstChild();
    while (!element.isNull()) {

        QTreeWidgetItem *item = new QTreeWidgetItem();
        item->setText(0, element.tagName());
        parentItem->addChild(item);

        examineChildElements(element, item);

        element = element.nextSibling();
    }
}

void Window::getMyPost(QString string)
{
    textEdit->setText(string);
}

void Window::showPage(QNetworkReply *replay)
{
    if(RecStatus)
   {
      QString text;
      QUrl url = replay->request().url();
      text += ">> " + url.toString() + "\n";

      QList<QByteArray> rHeaders = replay->request().rawHeaderList();
      foreach (QByteArray reqName, rHeaders)
     {
            QByteArray reqValue = replay->request().rawHeader(reqName);
            text += reqName + ": " + reqValue + "\n";;
     }
     text += "\n\n";

     text += "<< \n";
     QList<QByteArray> reqHeaders = replay->rawHeaderList();
     foreach (QByteArray reqName, reqHeaders)
     {
            QByteArray reqValue = replay->rawHeader(reqName);
            text += reqName + ": " + reqValue + "\n";;
     }

      QByteArray bytes = replay->readAll();
      text += "##### "+QString("%1").arg(bytes.length())+ "\n\n";
   }
}

void Window::on_pushButton_clicked()
{
    webView->page()->setContentEditable(true);

    QWebElement email = webView->page()->mainFrame()->findFirstElement("input[name=login]");
    QWebElement pass = webView->page()->mainFrame()->findFirstElement("input[name=passwd]");

    email.setAttribute("value","mylogin");
    pass.setAttribute("value","mypass");

    QWebElement button = webView->page()->mainFrame()->findFirstElement("input[type=submit]");
    if (button.isNull()) QMessageBox::critical(this, "", "error");
    button.evaluateJavaScript("this.click();");
}

void Window::on_pushButton_Rec_clicked()
{
    RecStatus = true;
}

void Window::on_pushButton_Pause_clicked()
{
    RecStatus = false;
}


P.S: Запись в QTextEdit является грубым приближением поэтому работает по установке флага непродолжителное время

РЕЗЮМЕ ВОПРОСОВ:
1) используюя класс  QNetworkAccessManager получить полное содержимое исходящего пакета(вместе с POST запросом).
2) почему зачастую в заголвке ответа указана длина данных (и они действительно есть - проверка сниффером), а replay->readAll() выбирает 0.
3) какие функции классов QWebView или QNetworkAccessManager переназначить, чтобы суметь изменить исходящие и отведные данные соответсвенно до отправки и до исполнения ? (некое подобие собсвенного фильтра)
Записан
thechicho
Гость
« Ответ #12 : Январь 30, 2012, 14:15 »

// 1) используюя класс  QNetworkAccessManager получить полное содержимое исходящего пакета(вместе с POST запросом).
самому интересно.
я обычно qDebug() делаю на пост данные в коде
и исходящие заголовки смотрю.

что тебе не хватает в этих данных?

// 2) почему зачастую в заголвке ответа указана длина данных (и они действительно есть - проверка сниффером), а replay->readAll() выбирает 0
давай конкретный пример, так не скажу.

//3) какие функции классов QWebView или QNetworkAccessManager переназначить, чтобы суметь изменить исходящие и отведные данные соответсвенно до отправки и до исполнения ? (некое подобие собсвенного фильтра)

ну популярном языке объясни с примерами. чо-нить придумаем тогда. а так я не догоняю чо ты хочешь.
если имеется в виду заголовки изменить у qwebview, то ему можно назначить QNetworkAccessManager с нужными заголовками. правда, если потом программно кнопки наживать на странице, будут отправляться стандартные заголовки. чувак тут говорил как можно задать свои заголовки на постоянку, но я еще не пробовал.
Записан
bosfor
Гость
« Ответ #13 : Январь 30, 2012, 23:28 »

// 1) используюя класс  QNetworkAccessManager получить полное содержимое исходящего пакета(вместе с POST запросом).
самому интересно.
я обычно qDebug() делаю на пост данные в коде
и исходящие заголовки смотрю.

что тебе не хватает в этих данных?

мне нужно видеть не только заголовок исходящего запроса но и то что идет после заголовка ))

я обычно qDebug() делаю на пост данные в коде
и исходящие заголовки смотрю.
примерчик относительно вышеприведенного проекта можно ?
Записан
bosfor
Гость
« Ответ #14 : Январь 30, 2012, 23:34 »

//3) какие функции классов QWebView или QNetworkAccessManager переназначить, чтобы суметь изменить исходящие и отведные данные соответсвенно до отправки и до исполнения ? (некое подобие собсвенного фильтра)

ну популярном языке объясни с примерами. чо-нить придумаем тогда. а так я не догоняю чо ты хочешь.
если имеется в виду заголовки изменить у qwebview, то ему можно назначить QNetworkAccessManager с нужными заголовками. правда, если потом программно кнопки наживать на странице, будут отправляться стандартные заголовки. чувак тут говорил как можно задать свои заголовки на постоянку, но я еще не пробовал.

ребят - идея такова:
1) после установки урл загружается указанная страница -->(вот то место)<-- и передается на отображение. Вот тут бы неплохо между моментом ее полного получения и передачей на отображение(исполнение) сделать програмные корректировки.
2) ну соответсвенно после того как был подготовлен запрос на получение очередного пакета и реальной его передачей серверу тоже установить возможность изменения содержимого. 

Картина задумки проясняется ?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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