当前位置: 首页 > news >正文

南昌网站建设利润免费全自动网页制作系统

南昌网站建设利润,免费全自动网页制作系统,wordpress内容替换,网站空间期限查询QT5实现https的post请求 前言一、一定要有sslErrors处理1、问题经过2、代码示例 二、要利用抓包工具1、问题经过2、wireshark的使用3、利用wireshark查看服务器地址4、利用wireshark查看自己构建的请求报文 三、返回数据只能读一次1、问题描述2、部分代码 总结 前言 QNetworkA…

QT5实现https的post请求

  • 前言
  • 一、一定要有sslErrors处理
    • 1、问题经过
    • 2、代码示例
  • 二、要利用抓包工具
    • 1、问题经过
    • 2、wireshark的使用
    • 3、利用wireshark查看服务器地址
    • 4、利用wireshark查看自己构建的请求报文
  • 三、返回数据只能读一次
    • 1、问题描述
    • 2、部分代码
  • 总结


前言

  1. QNetworkAccessManager、QNetworkRequest和QNetworkReply是QT5网络编程的API,三者共同完成HTTP或者HTTPS协议的通信。
  2. 初学者往往会程序编译没有问题,但是运行代码没有任何结果,于是不知道问题出在哪里。此时,要借助postmanwireshark等工具的帮助。

本文按照问题出现的顺序总结QT5的网络编程方法。

一、一定要有sslErrors处理

1、问题经过

我们知道,客户端发送HTTPS的post请求,需要手动构建请求报文的请求行、请求头部和请求体。一开始的时候,着急利用QNetworkRequest来实现构建请求报文(request),但是程序运行始终没有输出数据,以为是构建报文的格式不正确。于是简化,构建get报文,程序运行依然没有输出数据。后来,参考官网Example、Gitee、CSDN的代码,加入了sslErrors槽函数,程序终于有了反应。在利用QNetworkAccessManager::connectToHostEncrypted时提示错误:qt.network.ssl: QSslSocket: cannot resolve EVP_PKEY_base_id
这是HTTPS请求错误,原因在于本地OpenSSL版本与Qt支持的不匹配。通过检查、下载、编译和配置OpenSSL源代码,解决了这个问题。具体方法可以参考博文: 《(Linux)解决运行Qt程序时报错》,亲测有效。
如果不加sslErrors槽函数,那永远不知道是OpenSSL的问题,还傻傻地以为是报文格式、post方法不对。


参考资料:QNetworkReply Class | Qt Network 5.15.17


2、代码示例

httpspost.h部分代码如下

class HttpsPost : public QObject
{Q_OBJECTQNetworkAccessManager m_networkAccessManager;public:HttpsPost();void doPost();~HttpsPost();private://发送data数据QByteArray m_sendJsonData;QVariant data;public slots:void sslErrors(const QList<QSslError> &errors);void postReadyRead(QNetworkReply *reply);
}

httpspost.cpp部分代码如下:

#include <QtCore>
#include <QtNetwork>
#include <QSslConfiguration>
#include <QNetworkReply>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QDebug>
#include <QVector>#include "httpspost.h"HttpsPost::HttpsPost()
{connect(&m_networkAccessManager, &QNetworkAccessManager::finished, this, &HttpsPost::postReadyRead);#if QT_CONFIG(ssl)connect(reply, &QNetworkReply::sslErrors,this, &HttpsPost::sslErrors);
#endif   
}void HttpsPost::sslErrors(const QList<QSslError> &sslErrors)
{
#ifndef QT_NO_SSLforeach(const QSslError &error, sslErrors)qDebug() << "SSL error: " << error.errorString();#elseQ_UNUSED(sslErrors);
#endif
}

QNetworkReply类有信号对象(signals)sslErrors。这个信号可以用来发射、显示错误消息。从而利用自己编写的槽函数HttpsPost::sslErrors来显示、错误处理。

二、要利用抓包工具

1、问题经过

编译、安装了OpenSSL之后,程序运行仍然没有数据输出。此时,考虑到底有没有连接Web服务器,是否发送了post请求,所以想到利用网络抓包工具。我用的是wireshark抓包工具,很好用,360软件管家就有,安全有保障。

2、wireshark的使用

安装好wireshark工具之后,首先用postman发送get、post请求,看看正确的通信过程是怎样的。
①处:添加过滤器,只看本机和Web服务器IP地址的包。
②处:可以看到发送了post请求,点击可以查看请求报文内容。
③处:查看请求报文的格式和内容。根据这个可以比对自己构建的请求报文是否正确。
④处:可以看到协议版本是TLSV1.2。
在这里插入图片描述

3、利用wireshark查看服务器地址

服务器的地址可以通过QNetworkRequest类的构造函数来设置。例如:

QNetworkRequest m_httpRequest(QUrl("http://www.wangsansan.com/test/HttpsPostTest.php"));

有2个问题需要注意:

  1. QUrl地址中,http与https的连接过程、传输协议、端口都是不一样的。
  2. https服务器地址不能用IP地址(QUrl(“https://115.28.242.169 /test/HttpsPostTest.php”)),否则会报错:
    SSL error: "The host name did not match any of the valid hosts for this certificate"
    http服务器则可以用计算机名,也可以用IP地址。

参考资料:QNetworkRequest Class | Qt Network 5.15.17


4、利用wireshark查看自己构建的请求报文

构建请求报文要用到QNetworkRequest类。刚开始的时候,不知道使用setHeadersetRawHeader的效果。利用wireshark就可以查看了。例如,QNetworkRequest::m_httpRequest.setHeader(QNetworkRequest::LocationHeader, QByteArray("/test/HttpsPostTest.php"));的结果如下图所示:
在这里插入图片描述

部分代码如下:

void HttpsPost::doPost()
{QJsonDocument doc;QJsonObject jsonObjData;jsonObjData.insert("A", "111");     // 设置内容字段jsonObjData.insert("B", "222");     doc.setObject(jsonObjData);QString str = QString(doc.toJson());QByteArray content = str.toUtf8();int contentLength = content.length();//QSslConfiguration是QNetworkRequest的访问设置类,用于设置协议类型支持httpsQSslConfiguration config;config.setPeerVerifyMode(QSslSocket::VerifyNone);config.setProtocol(QSsl::TlsV1_2);  //构建QNetworkRequest对象,设置urlQNetworkRequest m_httpRequest(QUrl("http://www.wangsansan.com/test/HttpsPostTest.php"));//构建post请求报文// m_httpRequest.setHeader(QNetworkRequest::LocationHeader, QByteArray("/test/HttpsPostTest.php"));m_httpRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArray("application/json; charset=utf-8"));m_httpRequest.setRawHeader("Connection", QByteArray("keep-alive"));m_httpRequest.setHeader(QNetworkRequest::ContentLengthHeader, doc.toJson().size());//m_sendJsonData.length()reply = m_networkAccessManager.post(m_httpRequest, doc.toJson());//返回数据QNetworkReply *reply = m_networkAccessManager.get(m_httpRequest);

三、返回数据只能读一次

1、问题描述

到这里,向服务器发送post请求已经没有问题了。但是,运行程序仍然无法获取数据。问题应该出在获取返回数据上。刚开始时,复制了官网上的代码,问题依然存在。Gitee、CSDN上的代码,写法也各不相同。后来,看了官网的参考文档才知道,返回数据只能在返回数据结束之后,读一次

1.The QNetworkReply class contains the data and meta data related to a request posted with QNetworkAccessManager.
2.QNetworkReply is a sequential-access QIODevice, which means that once data is read from the object, it is no longer kept by the device.

QNetworkAccessManager::finished()QNetworkReply::finished(),都可以发送返回数据结束的信号(signal)。然后用槽函数来获取数据。您还可以使用QNetworkReply::isFinished()来检查QNetworkReply是否已完成。


参考文档:
QNetworkAccessManager Class | Qt Network 5.15.17
QNetworkReply Class | Qt Network 5.15.17

2、部分代码

httpspost.h如上文,httpspost.cpp部分代码如下:

HttpsPost::HttpsPost()
{connect(&m_networkAccessManager, &QNetworkAccessManager::finished, this, &HttpsPost::postReadyRead);#if QT_CONFIG(ssl)connect(reply, &QNetworkReply::sslErrors,this, &HttpsPost::sslErrors);
#endif   
}void HttpsPost::postReadyRead(QNetworkReply *reply)
{qDebug() <<"reply data:"<< QString::fromUtf8(reply->readAll());
}

运行结果举例:

reply data: "{\"error_code\":111,\"error_msg\":\"Access token expired\"}"

总结

至此,QT5利用QNetworkAccessManager、QNetworkRequest和QNetworkReply三个类可以实现https的post请求。但是,还有问题需要改进:

  1. 返回数据的处理
  2. post请求报文中的正文部分,其格式、内容、字节长度等还需要验证。Jason数据的嵌套还需要实现。
http://www.yayakq.cn/news/212524/

相关文章:

  • 建设装修网站交互式网站开发
  • 国外经典手机网站设计app开发费用明细
  • 深南花园裙楼 网站建设手机网站的建设价格
  • 商城网站设计企业数字资产币币交易所网站开发
  • 电脑网站视频怎么下载营销型网站手机端
  • 重庆网站设计定制东莞市品牌网站建设价格
  • app官网入口整站关键词排名优化
  • 网站建设中怎么编辑图片网站营销方式
  • 自己动手创建一个公司网站个人简历封面
  • 网站界面分类网站建设一条龙
  • 网站开发seo要求用户体验设计方法
  • 网站开发从零到上线贵州软件制作
  • 重庆网站建设公司哪个最好注册网站平台
  • 深圳网站建设服务平台重庆綦江网站制作公司电话
  • 网站做seo创业 做网站
  • 互动网站开发百度快照不更新
  • 广西送变电建设公司铁塔厂网站页面设计公司
  • 如何为一个网站做短连接没有初中毕业证怎么提升学历
  • 长春专业网站建设模板代理家庭 wordpress主题
  • 网站 推广动漫制作专业可以升什么本科
  • 基于vue.js旅游网站开发网页浏览器在哪里
  • 做一个网站后期维护需要做什么怎么把文章导入wordpress
  • 网站建设 管理与维护试题罗湖建设网站
  • 杭州网站制作多少钱wordpress提交友情链接
  • 网站建设自建服务器建设网站业务不好做
  • 浦口区建设局网站苏州微网站建设公司
  • 什么是网站的二级目录区块链微信小程序开发教程
  • 制作教育类网站免费建站平台0
  • 网站页面设计如何收费山西省建设监理协会网-官方网站
  • 名词解释 网站内容上海网络推广报价