Qt 之 使用 https发送 HTTP请求(使用OPENSSL库)

一、简述

在使用Qt发送HTTP请求中一般使用的链接都是http://前缀,而有的服务器支持 https://前缀的链接,而Qt本身是支持https的,但是https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在Qt中使用https需要进行SSL认证。实现非常容易,简单几步即可完成。

二、HTTPS和HTTP的区别

1、简介

超文本传输协议HTTP被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

2、区别

https协议需要到ca申请证书,一般免费证书很少,需要交费。

http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

三、如何进行SSL认证

1、首先,因为需要Openssl支持,使用SSL进行认证,所以需要对应的库文件 libeay32.dllssleay32.dll。需要下载libeay32.dll 和 ssleay32.dll两个库文件,将这两个库文件拷贝到程序生成目录下(即生成exe的同级目录)或者拷贝到QtNetwork模块的库文件目录中。

2、在发送HTTP请求之前加上如下代码

void onSendHttpsRequest(QString url)
{
    QNetworkAccessManager* pManager = new QNetworkAccessManager(this);
    QNetworkRequest request;

    // 发送https请求前准备工作;
    QSslConfiguration config;
    QSslConfiguration conf = request.sslConfiguration();
    conf.setPeerVerifyMode(QSslSocket::VerifyNone);
    conf.setProtocol(QSsl::TlsV1SslV3);
    request.setSslConfiguration(conf);

    request.setUrl(QUrl(url));       // "https://www.temp.com"
    QNetworkReply *pReply = pManager->post(request, bytePost);

    connect(pReply , SIGNAL(finished()) , this , SLOT(onFinished());
    connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError(QNetworkReply::NetworkError)));
}

// 请求完成;
void onFinished()
{
    QNetworkReply *pReplay = qobject_cast<QNetworkReply*>(sender());
    // 保存接受的数据;
    QByteArray replyContent = pReplay->readAll();
}

// 请求失败;
void onError(QNetworkReply::NetworkError errorCode)
{
    QNetworkReply *pReplay = qobject_cast<QNetworkReply*>(sender());
    // 输出错误码及错误信息;
    qDebug()<< errorCode;
    qDebug()<< pReplay->errorString();
}

关于两个库文件下载

1、在 http://slproweb.com/products/Win32OpenSSL.html 中下载 Win32 OpenSSL进行安装,将bin目录下面的库拷贝出来放到生成程序exe同级目录下即可。

2、 libeay32.dll 、 ssleay32.dll动态链接库直接在我的资源中进行下载。

http://blog.csdn.net/goforwardtostep/article/details/53588961

时间: 2024-10-12 14:14:44

Qt 之 使用 https发送 HTTP请求(使用OPENSSL库)的相关文章

Https发送POST请求[亲测可用]

1.直接建一个工具类放入即可 /** * 发送https请求共用体 */ public static JSONObject sendPost(String url,String parame,Map<String,Object> pmap) throws IOException, KeyManagementException, NoSuchAlgorithmException, NoSuchProviderException{ // 请求结果 JSONObject json = new JSO

Qt发送HTTP请求

http://hi.baidu.com/cmdmac/item/c45b9f0fb0d0938802ce1bbd 最近在搞QT跟服务器交互的东西,自然少不了发送和接受HTTP请求.在网上找了一些资料知道以前的QT版本是使用QHTTP类来处理HTTP请求的,新版本是使用QNetworkAccessManager来进行管理的. HTTP请求在QT中相应的类为QNetworkRequest,HTTP响应相应的类为QNetworkReply,下面是一个管理的发送HTTP请求并读取响应的例子://Test

Qt发起Http/Https请求

1. BurpSuite抓包 1.1 设置代理 burpsuite代理设置 浏览器代理设置(chrome),其他浏览器同理. 地址栏输入 chrome://settings/, 打开代理设置 设置代理端口 如果使用了代理插件,比如switchomega,可以这么设置 这样当选择使用代理选项的时候,请求包的数据也会被burpsuite拦截到. 1.2 导入证书 浏览器地址栏输入 http://burp/,如果有使用代理插件,建议先停用插件,待正确导入证书后开启使用,后续不再有影响. 点击CA Ce

php 发送post请求 https类型

/** * 发送post请求 * @author jiafeimao&dabai  * @createtime 2017-07-26 14:06:04 * @param string $url 请求地址 * @param array $post_data post键值对数据 * @return string */ function https_request($url,$data=null){ header("Content-type: text/html; charset=utf-8&

解决浏览器跨域限制发送ajax请求

一.什么是浏览器跨域限制?本质是什么? 所谓浏览器跨域限制,其实是为了数据安全的考虑由Netscape提出来限制浏览器跨域访问数据的策略,这是一中约定,正式叫法为浏览器同源策略,目前已经在大多数浏览器中支持. 本质上,所谓浏览器同源策略即:不允许浏览器访问跨域的Cookie,ajax请求跨域接口等.也就是说,凡是访问与自己不在相同域的数据或接口时,浏览器都是不允许的. 最常见的例子:对于前后端完全分离的Web项目,前端页面通过rest接口访问数据时,会出现如下问题: 不允许发送POST请求:在发

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比

使用httpclient实现http链接池与使用HttpURLConnection发送http请求的方法与性能对比 在项目中需要使用http调用接口,实现了两套发送http请求的方法,一个是使用apache的httpclient提供的http链接池来发送http请求,另一个是使用java原生的HttpURLConnection来发送http请求,并对两者性能进行了对比. 使用httpclient中的链接池发送http请求 使用最新的4.5.2版httpclient进行实现.在maven中引入 <

向微信服务器发送get请求

package weixinRespone; import java.io.IOException; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.BufferedReader;im

发送curl请求的函数

//发送curl请求的函数function curl_request($url, $post = false, $data=array(), $https = false){ //使用curl_init初始化一个curl请求 $ch = curl_init($url); //默认为get请求不需要设置请求方式和请求参数 //如果是post请求 if($post){ //设置请求方式 curl_setopt($ch, CURLOPT_POST, true); //设置请求参数 curl_setop

java 发送http请求

package cn.go4mi; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map; public class H