• Qt之QNetworkProxy(网络代理)


    简述

    QNetworkProxy类提供了一个网络层代理。

    QNetworkProxy提供了配置网络层代理支持Qt网络类的方法。目前支持的类有QAbstractSocket、QTcpSocket、QUdpSocket、QTcpServer和QNetworkAccessManager。

    介绍

    代理被设计的尽可能透明。也就是说,你现有的网络应用程序使用下面的代码就会自动支持网络代理。

    QNetworkProxy proxy;
    proxy.setType(QNetworkProxy::Socks5Proxy);
    proxy.setHostName("proxy.example.com");
    proxy.setPort(1080);
    proxy.setUser("username");
    proxy.setPassword("password");
    QNetworkProxy::setApplicationProxy(proxy);

    为个别套接字设置代理的另一种方法是使用QAbstractSocket::setProxy()和QTcpServer::setProxy()。这种情况下,可以使用以下方式禁用代理:

    serverSocket->setProxy(QNetworkProxy::NoProxy);

    网络请求

    以HTTP/HTTPS为例,我们经常需要进行抓包来分析数据,这时,利用之前讲过的Fiddler来分析,可参考:Fiddler(Web/HTTP调试利器)

    下面,通过调用天天动听的API来获取歌曲的信息,接口的使用不再赘述。

    QNetworkAccessManager networkAccessManager;
    
    QUrl url("http://search.dongting.com/song/search/old");
    
    // 设置请求参数
    QUrlQuery query;
    query.addQueryItem("q", QString::fromLocal8Bit("李荣浩"));
    query.addQueryItem("page", "1");
    query.addQueryItem("size", "100");
    
    url.setQuery(query);
    
    QNetworkRequest request;
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
    request.setUrl(url);
    
    // 开始请求
    QNetworkReply *pReply = networkAccessManager.get(request);
    
    QEventLoop loop;
    connect(pReply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    
    // 获取歌曲信息
    QByteArray bytes = pReply->readAll();

    设置代理

    打开Fiddler,并没有抓取到想要的信息,Why,因为我们没有设置网络代理。。。

    这时,只需要简单地几行代码就可以搞定了。

    效果

    这里写图片描述

    源码

    QNetworkProxy proxy;
    proxy.setType(QNetworkProxy::HttpProxy);
    proxy.setHostName("127.0.0.1");
    proxy.setPort(8888);
    ...
    networkAccessManager.setProxy(proxy);

    这时,所有的信息都尽收眼底。。。O(∩_∩)O~

  • 相关阅读:
    dom解析和sax解析
    pull解析和sax解析的区别
    HashMap和HashTable的区别
    Java Socket通信原理简介
    Socket通信原理简介
    Android获取网络连接状态(3G/Wifi)及调用网络配置界面
    Android布局控件之LinearLayout
    onAttachedToWindow () 和 onDetachedFromWindow () ; 以及更新视图的函数ondraw() 和dispatchdraw()的区别
    Android开源界面库--ResideMenu用法
    iOS如何接收服务端返回的布尔值
  • 原文地址:https://www.cnblogs.com/itrena/p/5938335.html
Copyright © 2020-2023  润新知