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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] QNetworkAccessManager POST, GET в cgi на c++  (Прочитано 7103 раз)
iks
Гость
« : Март 15, 2011, 23:25 »

Проблема не совсем стандартная или я чего-то недописал, но вопрос стоит в том что вроде все работает если отправляю короткие сообщения то нормально пишется в БД, а вот когда отправляю длинное сообщение то ни чего не принимается, а точнее говоря проходит проверки то есть прием есть на сервере, но сообщения ни какого нет, а точнее говоря записывается пустое сообщение, где проблема на клиенте отправляю вот так
Код:
toSite->setStrCgi("forum", "uid=ndfy5r757858jtu577u&razdel=abc&newTema=&idTema=15&newMsg="+txtMsgEdit->toPlainText());
Код:
#include "network.h"

network::network(){}

void network::setStrCgi(QString strUrl, QString postStr)
{

    connect(this, SIGNAL(finished(QNetworkReply*)),SLOT(readString(QNetworkReply*)));
    urls = "http://"+serverSite+"/cgi-bin/"+strUrl;
    if(postStr!=""){
        QByteArray data = postStr.toAscii();
        QBuffer *buffer = new QBuffer;
        buffer->setData(data);
        buffer->open(QIODevice::ReadOnly);

        this->post(QNetworkRequest(QUrl(urls)), buffer);
    } else
        this->get(QNetworkRequest(QUrl(urls)));
    return;
}

void network::readString(QNetworkReply *reply)
{
    emit siteResponse(reply->readAll());
    return;
}
или в cgi принимаю так
Код:
        int x = atoi(getenv("CONTENT_LENGTH"));
        char *postContent = new char [x];
        for(int i=0; i<x; i++)
            postContent[i] = getchar();

        // разбор строки
        Parse *queryPost = new Parse(postContent);
        char* uid = queryPost->get_item_n("uid");
        char* razdel = queryPost->get_item_n("razdel");
        char* newTema = queryPost->get_item_n("newTema");
        char* idTema = queryPost->get_item_n("idTema");
        char* newMsg = queryPost->get_item_n("newMsg");
        delete queryPost;
« Последнее редактирование: Март 17, 2011, 13:22 от iks » Записан
SimpleSunny
Гость
« Ответ #1 : Март 16, 2011, 00:00 »

Возьмите сниффер (wireshark к примеру) и посмотрите кто и что шлет.
Насколько помню данные в newMsg="+txtMsgEdit->toPlainText() надо будет дополнительно кодировать.
Записан
ufna
Гость
« Ответ #2 : Март 16, 2011, 01:24 »

а) есть ограничение на длину такого сообщения со стороны сервака, это надо слать по частям
б) POST запросы длинные лучше делать по-другому: http://ufna.ru/2010/10/16/qt-post-multipart-form-data
Записан
iks
Гость
« Ответ #3 : Март 16, 2011, 09:34 »

Насколько помню данные в newMsg="+txtMsgEdit->toPlainText() надо будет дополнительно кодировать.
Ну на счет этого в клиенте видно что на сайт отправляется уже QByteArray на прямую запихать QString в запрос даже не получится.

а) есть ограничение на длину такого сообщения со стороны сервака, это надо слать по частям
б) POST запросы длинные лучше делать по-другому: http://ufna.ru/2010/10/16/qt-post-multipart-form-data
А это сейчас посмотрю похоже с заголовком надо поработать, а по поводу длины вроде она на url есть и само собой сработает на GET запросах, почему и перешел на POST
« Последнее редактирование: Март 17, 2011, 13:34 от iks » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #4 : Март 16, 2011, 11:53 »

Если не ошибаюсь есть ограничения на размер данных передаваемых пост запросом, вот тут с этим боролись http://blog.alexshop.org/?p=63

А лучший вариант, это действительно взять снифер и посмотреть что куда идет и что приходит.
Записан
iks
Гость
« Ответ #5 : Март 16, 2011, 19:23 »

В клиенте проблем ни каких, возникла мысль посмотреть а что приходит на сервер использовал такой скрипт
Код:
    strWork *workStr = new strWork; // класс проверки и удаления нежелаемых символов
    long content_length = atol(workStr->preg_replace("^`<>/'", "", getenv("CONTENT_LENGTH")));
    char *postContent = (char *)malloc(content_length);
    fread(postContent,content_length,1,stdin);

    Parse *queryPost = new Parse(postContent); // класс разбора на пары &=

    char *fileMsg = "temp/newMsgForum";
    ofstream ofsfile(fileMsg);
    ofsfile << queryPost->get_item_n("newMsg") << endl;
    ofsfile.close();

    delete queryPost;
    delete workStr;
в файл все нормально пишется не зависимо от длины переданого текста, похоже просто у меня где-то тормоз стоит на длинные сообщения при обработке текста на сервере.
P.S. и даже нашел где, я при записе в БД прогонял проверку на удаление нечитаемых символов, так вот это и не успевало вернуть сообщение для добавления, сейчас перенес это в main и проверяю сразу при считывании CONTENT_LENGTH и все работает
--------------------------------
Решил проблему безразрывным текстом, вставив
Код:
str.replace(" ", "&ensp;");
то есть заменил все пробелы на короткий пробел, а то возникла еще одна проблема стало рвать по первому пробелу.
=========================================================================
Отправка в клиенте идет таким образом
Код:
        toSite = new network;
        toSite->moveToThread(toSite);
        toSite->setStrCgi( "forum", "uid="+uid+"&razdel="+razdelStr+"&newTema=&idTema="+idTema+"&newMsg="+txtMsgEdit->toPlainText() );
        toSite->start();
        connect(toSite, SIGNAL(siteResponse(QString)),SLOT(otvServer(QString)));
--------------------
class network
-------------------
network.h
Код:
#ifndef NETWORK_H
#define NETWORK_H

#include "gameGlobal.h" // в нем подключены все нужные мне библиотеки и обьявлены глобальные переменные
extern QString serverSite;
class network : public QThread
{
Q_OBJECT

public:
    network();
    void setStrCgi(QString strUrl, QString postStr){
        urls = "http://"+serverSite+"/cgi-bin/"+strUrl;
        dataPost = postStr.toAscii();
    }

protected:
    void run();

private:
    QByteArray dataPost;
    QNetworkAccessManager *manager;
    QNetworkReply* reply;
    QString urls;

signals:
    void siteResponse(QString strOtv);

private slots:
    void slotReadyRead();

};
network.cpp
Код:
#include "network.h"

network::network()
{
    manager = new QNetworkAccessManager(this);
    return;
}

void network::run()
{
    QNetworkRequest request;
    request.setUrl(QUrl(urls));
    //-- отправка POST
    if(dataPost != NULL){
        request.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain");
        request.setRawHeader(QByteArray("User-Agent"), QByteArray("User-Agent=Clint Site")); //-- необязательно
        reply = manager->post(request, dataPost);
    } else //-- если нет отправим GET
        reply = manager->get(request);

    connect(reply, SIGNAL(finished()), this, SLOT(slotReadyRead()));
    this->exec();
    return;
}

void network::slotReadyRead()
{
    emit siteResponse(reply->readAll());
    return;
}
----------------------
Принимаю на сервере вот так
Код:
    strWork *workStr = new strWork;
    long content_length = atol(workStr->preg_replace("^`<>/'", "", getenv("CONTENT_LENGTH")));
    char *postContent = (char *)malloc(content_length);
    fread(postContent,content_length,1,stdin);

    Parse *queryPost = new Parse(postContent);
    uid = queryPost->get_item_n("uid");
    newMsg *msgForum = new newMsg(queryPost->get_item_n("razdel"),
                                  queryPost->get_item_n("newTema"),
                                  queryPost->get_item_n("idTema"),
                                  queryPost->get_item_n("newMsg")
                                  );

    delete queryPost;
    delete workStr;
--------------
Class Parse тут полностью выложен
удаление нежилаемых символов обсуждалось в этой теме
« Последнее редактирование: Март 17, 2011, 13:50 от iks » Записан
iks
Гость
« Ответ #6 : Март 16, 2011, 21:08 »

Если не ошибаюсь есть ограничения на размер данных передаваемых пост запросом, вот тут с этим боролись http://blog.alexshop.org/?p=63
Ну там основная проблема не в том что ограничевает POST, а в том что там ножку хозяева сервера поставили, у меня как то ни когда не было этого, хост вроде платный и до этого гонял флеш а там размеры файлов шли ни такие мелкие как сейчас добавлял данным методом, но спасибо конечно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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