实战PyQt5: 130-使用HTTP请求下载文件
文章插图
在桌面应用中 , 往往需要从网络获取一些数据 , 比如下某个图像或者文本文件 , 查询城市天气预报 , 加载网络地图等等 。 在Qt中 , 提供一些网络处理类 , 可以很方便地实现上面列出的需求 。 核心类QNetworkAccessManager类处理应用程序发送网络请求和接收回复 , 类QNetworkRequest类保存QNetworkAccessManager发送的请求 。 QNetworkReply类管理使用QNetworkAccessManager发送的请求的数据和标头 。
QNetworkAccessManager简介使用QNetworkAccessManager类创建网络访问对象 , 该对象保存其发送的请求的通用配置和设置 。 它包含代理和缓存配置及与此类问题相关的信号外 , 还包含可用于监视网络操作进度的回复信号 。 一个QNetworkAccessManager实例对于整个Qt应用程序应该足够了 。 由于QNetworkAccessManager基于QObject , 因此只能在其所属的线程中使用 。
创建QNetworkAccessManager对象后 , 应用程序可以使用它通过网络发送请求 。 QNetworkAccessManager提供了一组标准函数 , 这些函数接受一个请求和可选数据 , 并且每个函数都返回一个QNetworkReply对象 。 返回的对象用于获取对相应请求所做响应所返回的任何数据 。
一个简单的网络下载可以通过以下方式完成:
nam =QNetworkAccessManager(self)nam.finished.connect(self.replyFinished)nam.get(QNetworkRequest(QUrl('')
QNetworkAccessManager具有异步API 。 replyFinished调用上面的插槽时 , 它采用的参数是QNetworkReply对象 , 其中包含下载的数据以及元数据(标头等) 。
注意:请求完成后 , 用户有责任在适当的时候删除QNetworkReply对象 。 不要在连接finished()的插函数内直接删除它 。 但可以使用deleteLater()函数来删除QNetworkReply对象 。
注意: QNetworkAccessManager将接收到的请求排队 。 且并行执行的请求数取决于协议 。 当前 , 对于台式机平台上的HTTP协议 , 针对一个主机/端口组合并行执行6个请求 。
假设QNetworkAccessManage管理器对象已经存在 , 那么一个更复杂的示例可以是:
【实战PyQt5: 130-使用HTTP请求下载文件】request = QNetworkRequest()request.setUrl(QUrl(''))request.setRawHeader('User-Agent','MyOwnBrowser 1.0') reply = nam.get(request)reply.readRead.connect(self.slotReadyRead)reply.errorOccurred.connect(self.slotError)reply.sslErrors.connect(self.slotSslErrors)
QNetworkAccessManager 常用函数:
- get(self, request): 发送request以获取内容 , 返回一个打开的用于读取的新QNetworkReply对象 , 只要有新数据到达 , 该对象就会发出readyRead()信号 。
- put(self, request, data): 将data内容上载到目标request , 并返回一个新的QNetworkReply对象 。 调用此函数时 , 必须打开数据进行读取并保持有效 , 直到发出用于此回复的finish()信号为止 。 由协议决定是否有任何可用于从返回的对象读取的内容 。 对于HTTP , 服务器可以发送一个小的HTML页面 , 指示上传成功(成功) 。 其他协议可能会在其答复中包含内容 。 注意:对于HTTP , 此请求将发送一个PUT请求 , 大多数服务器都不允许 。 表单上传一般使用POST机制(包括通过HTML表单上传文件的机制) 。
- post(self, request, data): 将HTTP POST请求发送到由request指定的目标 , 并返回一个已打开以供读取的新QNetworkReply对象 , 其中将包含服务器发送的回复 。 数据设备的内容将被上载到服务器 。 数据必须处于打开状态以供读取 , 并且必须保持有效 , 直到发出此回复的finish()信号为止 。 注意:在HTTP和HTTPS以外的协议上发送POST请求是未定义的 , 可能会失败 。
- head(self, request): 投递一个request,以获得网络头信息 , 返回一个包含该头信息的QNetworkReply对象 。
- authenticationRequired(self, reply, authenticator): 每当最终服务器在传递所请求的内容之前请求身份验证时 , 都会发出此信号 。 连接到该信号的插槽应填充身份验证器对象中内容的凭据(可以通过检查答复对象来确定) 。
- encrypted(self, reply): SSL/TLS会话成功完成初始握手后 , 将发出此信号 。 此时 , 尚未传输任何用户数据 。 该信号可用于对证书链进行其他检查 , 例如在网站的证书已更改时通知用户 。 该回复参数指定网络回复负责 。 如果答复不符合预期的标准 , 则应通过连接到此信号的插槽调用QNetworkReply.abort()来终止答复 。 可以使用QNetworkReply.sslConfiguration()方法检查正在使用的SSL配置 。
- finished(self, reply): 每当待处理的网络回复结束时 , 都会发出此信号 。 该回复参数将包含一个指向刚刚结束的答复 。 该信号与QNetworkReply.finished()信号一起发射 。
- Wireshark数据包分析实战:TCP报文段重组
- Python爬虫采集网易云音乐热评实战
- Django实战016:django中使用redis详解
- HTTP实战之Wireshark抓包分析
- Wireshark数据包分析实战:网卡卸载
- Python数据分析:数据可视化实战教程
- 实战经验:电商平台遭遇CC攻击,我们是如何应对的?
- Tencent IN对话 | 八位互联网实战家,实战智慧营销商学院
- HLS实战之Wireshark抓包分析
- Vue实战091:Vue项目部署到nginx服务器