我怎么知道QNetWorkReply来自哪个代理?

问题描述 投票:0回答:1

这是HTTP请求发送方法。当目标网站响应时,将调用httpFinished()。

void HTTPClientBase:: HttpRequestGet()
{
    network_manager.setProxy(proxy);
    QNetworkRequest network_request;

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


    reply = network_manager.get(network_request);
    connect(reply, SIGNAL(finished(QNetWorkReply*)), this, SLOT(httpFinished(QNetWorkReply*)));
}

void HTTPClientBase::httpFinished(QNetWorkReply* reply)
{
    // How do I know this reply comes from which proxy?
}

我可以循环调用HttpRequestGet()。

static HTTPClientBase myClient;
for(int i=0; i<20; i++)
{
  myClient.setUrl("https:\\www.google.com");
  myClient.setProxy("123.123.123.123:1234"); // The proxy changes every time in this loop.
  myClient.HttpRequestGet();
}

[HTTPClientBase::httpFinished(QNetWorkReply* reply)被调用时,我如何知道此回复来自哪个代理?}

c++ qt qnetworkaccessmanager qnetworkreply qnetworkrequest
1个回答
1
投票

根据QNetworkReply文档,您可以使用成员函数QNetworkReply::request()获得相应的请求。

无论如何,QNetworkRequest没有setProxy的成员函数

但是如果您要为QNetworkAccessManager设置代理,则可以通过QNetworkReply::manager()指向相应的管理器。

注意连接命令。 finished()没有参数QNetworkReply*,因此您的connect命令也会失败,因此您必须将HTTPClientBase::httpFinished(QNetWorkReply* reply)更改为HTTPClientBase::httpFinished()

...
    connect(reply, SIGNAL(finished()), this, 
    SLOT(httpFinished()));
}

void HTTPClientBase::httpFinished()
{
    QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
    if(reply){
        QNetworkAccessManager * manager = reply->manager();
        QNetworkProxy proxy = manager->proxy();
        // now you have the proxy 
    }

}

如您所见,您必须使用sender()来获取实际的信号发送器。您需要为每个代理创建不同的QNetworkAccessManager实例。如果您有代理池,请首先创建QNetworkAccessManager实例,然后根据您的特定需求进行选择。

如果您不想为每个代理创建一个净QNetworkAccessManager,则可以执行以下操作:

void HTTPClientBase:: HttpRequestGet()
{
    network_manager.setProxy(proxy);
    QNetworkRequest network_request;

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


    reply = network_manager.get(network_request);
    //new member variable: QHash<QNetworkReply*,QString> m_RequestToProxy;
    m_RequestToProxy.insert(reply,proxy);

    connect(reply, SIGNAL(finished()), this, SLOT(httpFinished()));
}

void HTTPClientBase::httpFinished()
{
    QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
    if(reply){
        QString proxy = m_RequestToProxy.take(reply);
        //check if proxy is valid
        //and then do whatever you want
    }
}

-1
投票

对我来说,很明显每个请求都有一个名为proxy的成员变量。我想念什么?

void HTTPClientBase::httpFinished(QNetWorkReply* reply)
{
    int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute").toInt(nullptr);
    QString phrase = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute").toString();

    QString logline = "Got response of " + QString::number(status) + " " +
                       phrase + " " + "through proxy: " + this->proxy);
}
© www.soinside.com 2019 - 2024. All rights reserved.