HTTP和HTTPS有哪些区别
1.HTTP是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS则解决HTTP不安全的缺陷,在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输
2.HTTP连接建立相对简单,TCP三次握手之后便可以进行HTTP的报文传输。而HTTPS在TCP三次握手之后,还需进行SSL/TLS的握手过程,才可进行加密报文传输。
3.两者的默认端口不一样,HTTP默认端口是80,HTTPS的默认端口是443
4.HTTPS协议需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的
HTTP 常见的状态码有哪些
2×× | 成功,报文已经收到并被正确处理(200,204,206) |
3×× | 重定向,资源位置发生变动,需要客户端重新发送请求(301,302,304) |
4×× | 客户端错误,请求报文有误,服务器无法处理(400,403,404) |
5×× | 服务器错误,服务器在处理请求时内部发生了错误(500,501,502,503) |
Qt中HTTP的接口类
- 实现高层网络操作的类
--QNetworkRequest类
通过一个URL地址发起网络协议请求,也保存网络请求的信息,目前支持HTTP、FTP和局部文件URLs的下载或上传
(PS:Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL(Uniform Resource Locator,统一资源定位器)。它是www的统一资源定位标志,简单地说URL就是web地址,俗称“网址”。)
--QNetworkAccessManager类
用于协调网络操作。在QNetworkResquest发起一个网络请求后,QNetworkAccessManager类负责发送网络请求,创建网络响应。
--QNetworkReply类
表示网络请求的响应。由QNetworkAccessManager在发送一个网络请求后创建一个网络响应。QNetworkReply提供的信号finished()、readyRead()和downloadProgress()可以监测网络响应的执行情况,执行相应操作。
案例:基于HTTP协议的网络文件下载
导入头文件
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QNetworkAccessManager>
下载代码
// "下载"
void Widget::on_btnDownload_clicked()
{
QString urlSpec = ui->editUrl->text().trimmed(); // 获取用户输入的要下载文件的url
if(urlSpec.isEmpty()){
QMessageBox::information(this,"下载","请输入需要下载的URL");
return;
}
QUrl newUrl = QUrl::fromUserInput(urlSpec);
if(!(newUrl.isValid())){
QMessageBox::information(this,"下载",
QString("无效的URL:%1\n 错误信息:%2").arg(urlSpec,newUrl.errorString()));
return;
}
QString tempDir = ui->editPath->text().trimmed(); // 获取保存下载文件的路径
if(tempDir.isEmpty()){
QMessageBox::information(this,"下载","请指定保存下载文件的路径");
return;
}
QString fullFileName = tempDir + newUrl.fileName();
if(QFile::exists(fullFileName))
QFile::remove(fullFileName); // 如果文件已存在,则删除
downloadedFile = new QFile(fullFileName);
if(!downloadedFile->open(QIODevice::WriteOnly)){
QMessageBox::information(this,"下载","临时文件打开失败");
return;
}
ui->btnDownload->setEnabled(false);
reply = networkAccessManager.get(QNetworkRequest(newUrl)); // 发动网络请求,获取网络响应对象
// 信号和槽函数的连接
connect(reply, SIGNAL(readyRead()),this, SLOT(onReadyRead()));
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(onDownloadProgress(qint64,qint64)));
connect(reply, SIGNAL(finished()), this, SLOT(onFinished()));
}