【问题标题】:How do I know a QNetWorkReply comes from which proxy?我如何知道 QNetWorkReply 来自哪个代理?
【发布时间】:2020-04-19 19:32:42
【问题描述】:

是一种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)被调用时,我怎么知道这个回复来自哪个代理? }

【问题讨论】:

  • mmmm,QNetworkRequest 没有 setProxy() 方法,但你在其中使用了它....是错字吗?
  • @eyllanesc,我的错,是 QNetWorkManager 有一个 setProxy()。

标签: c++ qt qnetworkaccessmanager qnetworkreply qnetworkrequest


【解决方案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
    }
}

另一个更好的解决方案是设置回复属性并将其放入槽中。

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);
    reply->setProperty("_proxy_",proxy);

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

void HTTPClientBase::httpFinished()
{
    QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
    if(reply){
        QVariant v_proxy = reply->property("_proxy_");
        //check if proxy is valid
        if(v_proxy.isValid()){
             QString proxy = v_proxy.toString();
             //and then do whatever you want
        }

    }
}

【讨论】:

  • 这是我的错。 setProxy 是 QNetworkAccessManager 的一个方法。
  • 我的问题是network_manager.setProxy(proxy); 将在不到 1 秒的时间内被调用 20 次。但是 httpFinished 会在 2 或 3 秒后被调用。当我在 httpFinished() 中调用 manager-&gt;proxy() 时,我认为这将是最后一个代理(不是对应的代理)。我会为此做一个测试。
  • network_manager 是一个成员变量值。所有请求都使用同一个。
  • 这就是为什么我说,你必须创建一个QNetworkAccessManager 的池。您还可以创建一个 QHash 来跟踪哪个请求属于哪个代理,但我不建议这样做。
  • 另一种解决方案是,如果想要避免使类膨胀@ 987654342@ 和其他成员。
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多