[英]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.