一、HTTPS和HTTP区别
1. 从定义上看
HTTP: HyperText Transfer Protocol
HTTPS: HyperText Transfer Protocol over Secure Socket Layer
2. 从分层上看
HTTP: HTTP -> Socket API -> TCP/QUIC①
HTTPS: HTTP -> 安全层 -> Socket API -> TCP/QUIC
3. 安全层
显而易见,HTTPS比HTTP多了一个“安全层②”。
所谓“安全层”,无非是为了保证数据安全。其中涉及的技术,简单来说有三个:
- 数据加密:防止数据被第三方窥探到。通过AES、DES、RSA等加解密算法实现
- 数据完整性:防止数据被破坏。通过各种散列函数算法实现,如MD4/MD5,SHA-1/SHA-256等
- 通信双方认证:防止冒充。通过证书技术实现
4. 安全层实现
安全层实现主流且常见的有OpenSSL、Mbed TLS,双方区别主要应用场景不同:
- OpenSSL庞大,主要应用于PC、高端CPU上,如支持Linux的CPU
- Mbed TLS更加轻量,可以在一些低端CPU,如Arm的Cortex-M系列上运行。在IoT领域,Mbed TLS大放异彩
二、Qt HTTPS环境配置
Qt的安全层使用的是OpenSSL,支持HTTPS请求需要配置OpenSSL环境。
不过,无需自己编译OpenSSL或者满世界找编译好的库。Qt的安装路径下已经有现成的dll库。
以Mingw编译环境为例,这两个dll位于:C:\Qt\Qt5.9.1\Tools\mingw530_32\opt\bin。
把libeay32.dll 和 ssleay32.dll拷贝到程序生成目录下(即生成exe的同级目录)或者加入到系统环境变量里都可以。
三、HTTPS代码示例
1. 准备工作
- HTTPS服务器:https://httpbin.org
- 调试工具:curl
2.示例功能
- 向HTTPS服务器发送POST方法,获取Json格式数据,显示在一个QPlainText控件里
- 向HTTPS服务器发送GET方法,获取一个PNG格式图片,显示在一个QLabel控件里
3.UI和数据分离
HttpClient负责HTTPS网络连接,数据获取;获取数据后发送Signal给HttpClientView,HttpClientView负责数据结果呈现。
4.示例代码
4.1 HttpClient
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
|
4.2 HttpClientView
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
|
4.3 UI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
|
4.4 关键代码
四、报错、原因分析及解决
1. qt.network.ssl: QSslSocket: cannot call unresolved function
原因:未找到libeay32.dll 和 ssleay32.dll,检查环境设置。
2.QNetworkReply::UnknownNetworkError
原因:由问题1引起,解决方式同上。