Qt实现类PostMan的get、post请求

Qt怎么开发一个简易的http测试工具呢?

引入Qt相应网络类的头文件(getPostTool.h)

1
2
3
4
5
6
7
#include <QNetworkAccessManager>    //加载网络请求头文件
#include <QNetworkReply>
#include <QNetworkRequest> //加载发送请求头文件
private slots:
void oneProcessFinished(QNetworkReply *);
private:
QNetworkAccessManager *manage; //定义

在构造函数中实例化(getPostTool.cpp)

1
2
manage = new QNetworkAccessManager(this);       //分配空间
connect(manage,SIGNAL(finished(QNetworkReply*)),this,SLOT(oneProcessFinished(QNetworkReply*)));//绑定完成信号

开始发送请求

1
2
3
4
5
6
7
8
9
10
11
12
void getPostTool::on_pushButton_clicked(){
QNetworkRequest req;
QJsonObject json;
QJsonDocument doc;
QString raw;
QByteArray data; // 最终传输的数据
QString url = ui->lineEdit->text(); //获取地址
req.setUrl(QUrl(url)); //获取地址
req.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
manage->get(QNetworkRequest(QUrl(url))); //请求实现
manage->post(req, data); //请求实现
}

绑定完成信号函数

1
2
3
4
5
void getPostTool::oneProcessFinished(QNetworkReply *reply){
QString body = reply->readAll();
ui->textEdit->setText(body);
reply->deleteLater();
}

大致上的主体功能就是这样,然后要加上发送时的ContentTypeHeader及参数量可设置,可以用tabWidget实现两个选项卡的切换,然后对于参数量可设置下多参数的输入可使用tableView来编辑和显示。至于raw格式的参数则可用QtextEdit来编辑。多参数输入x-www-form-urlencoded(ui->rb_xw)raw(ui->rb_raw)格式同在一个tab页面下,可使用radioButtonButtonGroup(setBodyBtnGroup)来实现单选模式,用setVisible(setBody(int))实现显示切换。

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
void getPostTool::InitXwwListModel(){
xwwListModel=new QStandardItemModel(this);
setBodyBtnGroup = new QButtonGroup(this);
setBodyBtnGroup->addButton(ui->rb_xw);
setBodyBtnGroup->addButton(ui->rb_raw);
connect(setBodyBtnGroup,SIGNAL(buttonClicked(int)),this,SLOT(setBody(int)));
ui->tableView_xww->setVisible(true);
ui->textEdit_raw->setVisible(false);
ui->btn_addNewRow->setVisible(true);
// 自动延伸填满整个宽度
ui->tableView_xww->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// 背景色交替
ui->tableView_xww->setAlternatingRowColors(true);
ui->tableView_xww->setStyleSheet("QTableView::item {alternate-background-color: #f3f4f5;}");
// 设置选中行背景色
ui->tableView_xww->setStyleSheet("QTableView::item:selected {background-color: #F8F0DD;color: #3a3a3a;}");
ui->tableView_xww->setModel(xwwListModel);
//设置不显示格子线
ui->tableView_xww->setShowGrid(false);
ui->tableView->setUpdatesEnabled(false);
xwwListModel->setHorizontalHeaderItem(0,new QStandardItem(QObject::tr("KEY")));
xwwListModel->setHorizontalHeaderItem(1,new QStandardItem(QObject::tr("VALUE")));
xwwListModel->setHorizontalHeaderItem(2,new QStandardItem(QObject::tr("DESCRIPTION")));
xwwListModel->setHorizontalHeaderItem(3,new QStandardItem(QObject::tr("OPTION")));
on_btn_addNewRow_clicked();
ui->tableView->setUpdatesEnabled(true);
ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked);
}
void getPostTool::setBody(int index){
switch (index) {
case -2:
ui->tableView_xww->setVisible(true);
ui->textEdit_raw->setVisible(false);
ui->btn_addNewRow->setVisible(true);
break;
case -3:
ui->tableView_xww->setVisible(false);
ui->textEdit_raw->setVisible(true);
ui->btn_addNewRow->setVisible(false);
break;
default:
break;
}
}

参数数量可变化,则应在每一行加入删除按钮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 新建一行
void getPostTool::on_btn_addNewRow_clicked()
{
int i = xwwListModel->rowCount();
for(int j=0;j<3;j++){
xwwListModel->setItem(i,j,new QStandardItem(""));
}
add_del_btn(i);
}
// 在第四列添加删除按钮
void getPostTool::add_del_btn(int i){
//为这个第四列添加按钮
QPushButton *btn_delrow = new QPushButton("remove row");
btn_delrow->setProperty("row", i); //为按钮设置row属性
connect(btn_delrow, SIGNAL(clicked(bool)), this, SLOT(removeRow(bool)));
ui->tableView_xww->setIndexWidget(xwwListModel->index(xwwListModel->rowCount()-1, 3), btn_delrow);
}
// 移除本行
void getPostTool::removeRow(bool){
xwwListModel->removeRow(ui->tableView_xww->currentIndex().row());
}

发送体有两种选择,用setBodyBtnGroup->checkedId()确认是x-www-form-urlencodedraw格式(on_pushButton_clicked())

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch (setBodyBtnGroup->checkedId()) {
case -2: // xww
for(int i=0; i<xwwListModel->rowCount();i++){
json.insert(xwwListModel->item(i,0)->text(), xwwListModel->item(i,1)->text());
}
doc.setObject(json);
data = doc.toJson(QJsonDocument::Compact);
break;
case -3: // raw
raw = ui->textEdit_raw->toPlainText();
data = raw.toUtf8();
break;
default:
break;
}

ui->comboBox->currentIndex()确认是getpost请求

1
2
3
4
5
6
7
8
9
10
11
12
switch (ui->comboBox->currentIndex()) {
case 0: //get
manage->get(QNetworkRequest(QUrl(url))); //请求实现
break;
case 1: //post
req.setUrl(QUrl(url)); //获取地址
req.setHeader(QNetworkRequest::ContentTypeHeader, headerListModel->item(0,1)->text());// "application/json"
manage->post(req, data); //请求实现
break;
default:
break;
}

然后运行起来的大致就如下图
raw.png
xwww.png