簡體   English   中英

我怎么知道 QNetWorkReply 來自哪個代理?

[英]How do I know a QNetWorkReply comes from which proxy?

它是一種 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)被調用時,我怎么知道這個回復來自哪個代理? }

根據QNetworkReply文檔,您可以使用成員函數QNetworkReply::request()獲取相應的請求。

無論如何, QNetworkRequest 沒有setProxy成員函數

但是,如果您為QNetworkAccessManager設置代理,您可以通過QNetworkReply::manager()獲得指向相應管理器的指針。

注意連接命令。 HTTPClientBase::httpFinished(QNetWorkReply* reply) 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
        }

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM