简体   繁体   English

使用QNetworkAccessManager发布请求

[英]use `QNetworkAccessManager` post request

i use QNetworkAccessManager post request to a website: 我使用QNetworkAccessManager向网站发布请求:

    void Spider::getProducts()
    {
        connect(&manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getProducts(QNetworkReply*)));

        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

        request.setUrl(QUrl("http://www.example.com/query"));

        for(int i = 0; i < categories.size(); ++i)
        {
            if(categories[i].isCategory())
            {
                isSubCategory = false;

                emit manager.finished(reply);
            }
            else
            {
                for(int page_number = 0; page_number < categories[i].getPageCount(); ++i)
                {
                    isSubCategory = true;

                    QJsonObject json;

                    json.insert("NValue", categories[i].getNValue());
                    json.insert("NodeId", categories[i].getNodeId());
                    json.insert("StoreId", categories[i].getStoreId());
                    json.insert("StoreType", categories[i].getStoreType());
                    json.insert("PageNumber", ++page_number);
                    json.insert("SubCategoryId", categories[i].getSubCategoryId());

                    QJsonDocument doc;

                    doc.setObject(json);

                    QByteArray request_body = doc.toJson();

                    manager.post(request, request_body);
                }
            }
        }
    }

when i run this program, at beginning, this program run normally, after running for a while, it will stop: neither terminated nor continue to run. 当我运行该程序时,开始时,该程序正常运行,运行一段时间后,它将停止:既不终止也不继续运行。 i can not figure out why it behavior like this? 我不知道为什么会这样? is there anything that needed to be noticed when use QNetworkAccess ? 使用QNetworkAccess时需要注意什么吗? or i am refused by that website? 还是那个网站拒绝了我? ... ...

You are using the same QNetworkAccessManager object in a loop multiple times. 您正在循环中多次使用同一个QNetworkAccessManager对象。 It is incorrect. 不正确 For each separate post request you need a separate QNetworkAccessManager object if you want to send requests in parallel. 对于每个单独的发布请求,如果要并行发送请求,则需要一个单独的QNetworkAccessManager对象。 Else if you only want to use a single instance then you need to serialize your post requests by sending next post request when the previous ends in the finished slot. 否则,如果您只想使用一个实例,则需要在前一个结束于已完成的插槽中时发送下一个发布请求来序列化发布请求。

Updated: Try out this code, it uses single QNetworkAccessManager object, you will need to check for correct place of i++ as per your needs 更新:尝试此代码,它使用单个QNetworkAccessManager对象,您将需要根据需要检查i ++的正确位置

connect(&manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(getProducts(QNetworkReply*))); // add this to constructor of your program

void Spider::getProducts()
    {
        static int i = 0;
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

        request.setUrl(QUrl("http://www.example.com/query"));

        while(categories[i].isCategory())
        {
            isSubCategory = false;
            i++;
        }
        if(i == categories.size())
        {
           emit allPostRequestsDone();
           return;
        }

            else
            {
                i++;
                if(page_number < categories[i].getPageCount())
                {
                    isSubCategory = true;

                    QJsonObject json;

                    json.insert("NValue", categories[i].getNValue());
                    json.insert("NodeId", categories[i].getNodeId());
                    json.insert("StoreId", categories[i].getStoreId());
                    json.insert("StoreType", categories[i].getStoreType());
                    json.insert("PageNumber", ++page_number);
                    json.insert("SubCategoryId", categories[i].getSubCategoryId());

                    QJsonDocument doc;

                    doc.setObject(json);

                    QByteArray request_body = doc.toJson();

                    manager.post(request, request_body);
                }
            }
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM