首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何知道QNetWorkReply来自哪个代理?

我如何知道QNetWorkReply来自哪个代理?
EN

Stack Overflow用户
提问于 2019-12-31 07:57:17
回答 1查看 278关注 0票数 0

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

代码语言:javascript
复制
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()。

代码语言:javascript
复制
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)时,我如何知道这个答复来自哪个代理?}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-31 08:26:38

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

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

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

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

代码语言:javascript
复制
...
    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 
    }

}

正如您所看到的,您必须使用发送者()来获取实际的信号发送方。您需要为每个代理创建不同的QNetworkAccessManager实例。如果您有代理池,那么首先创建您的QNetworkAccessManager实例,并根据您的特定需求选择它们。

如果您不想为每个代理创建一个新的QNetworkAccessManager,您可以这样做:

代码语言:javascript
复制
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
    }
}

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

代码语言:javascript
复制
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
        }

    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59541246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档