qt怎么接收post数据_Linux QT 4G发送HTTP POST请求发送JSON格式的数据

一、在PC Window(QT5版本)

1.1、构建URL

1.2、构建HTTP请求头

1.3、连接信号与操作,接收服务器回复的消息

槽函数这里我们要在头文件定义,然后把处理过程实现。

void MainWindow::replyFinished(QNetworkReply *reply)

{

char recvbuffer[128] ;

memset(recvbuffer,0,128);

//1、获取响应状态码

variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

if (variant.isValid())

qDebug() << variant.toInt();

//2、获取响应头

variant = reply->header(QNetworkRequest::ContentTypeHeader);

if (variant.isValid())

qDebug() << variant.toString();

//3、获取响应信息

QByteArray bytes = reply->readAll();

qDebug() << bytes ;

QJsonValue success_value ;

QJsonValue message_value ;

QJsonParseError jsonError;

//转换为Json文档

QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);

//解析时没有发生错误

if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))

{

if (doucment.isObject()) { // JSON 文档为对象

{

// 转化为对象

QJsonObject object = doucment.object();

// 包含指定的 key

if (object.contains("success")) {

// 获取指定 key 对应的 value

success_value = object.value("success");

qDebug() << "success_value : " << success_value.toBool();

}

// 包含指定的 key

if (object.contains("message")) {

// 获取指定 key 对应的 value

message_value = object.value("message");

qDebug() << "message_value : " << message_value.toString();

}

}

}

}

if(true == success_value.toBool())

{

qDebug() << "数据上传成功";

}

}

至于处理过程为什么要去JSON格式的数据,那是根据我的服务器给我返回的消息来进行处理的,其中最重要的是readAll得到的响应消息,服务器给我回复的是JSON格式的数据,所以我就要以JSON的格式去解析这个数据。那当然,如果你想玩,就跟AT指令一样,服务器回个OK\r\n给我也可以啊。。。哈哈哈,没毛病。

1.4、构造要发送的JSON数据

构造的结果就是===> "{\"detail\":\"1\",\"type\":\"2\"}"

1.5、发送POST请求

源码实现如下:

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

// URL

baseUrl = "http://120.78.136.134:9002/api/explosive/messages";

QUrl url(baseUrl);

// 构造Json数据

json.insert("type", "2");

json.insert("detail", "1");

QJsonDocument document;

document.setObject(json);

dataArray = document.toJson(QJsonDocument::Compact);

// 构造请求头

request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

request.setUrl(url);

manager = new QNetworkAccessManager(this);

// 连接信号槽

connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));

dataArray = "{\"detail\":\"1\",\"type\":\"2\"}" ;

qDebug() << dataArray ;

// 发送请求

manager->post(request, dataArray);

}

MainWindow::~MainWindow()

{

delete ui;

}

void MainWindow::replyFinished(QNetworkReply *reply)

{

//1、获取响应状态码

variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

if (variant.isValid()){

qDebug() << variant.toInt() ;

}

//2、获取响应头

variant = reply->header(QNetworkRequest::ContentTypeHeader);

if (variant.isValid())

qDebug() << variant.toString();

//3、获取响应信息

QByteArray bytes = reply->readAll();

qDebug() << bytes ;

ui->textBrowser->append(bytes);

QJsonValue success_value ;

QJsonValue message_value ;

QJsonParseError jsonError;

//转换为Json文档

QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);

//解析时没有发生错误

if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))

{

if (doucment.isObject()) { // JSON 文档为对象

{

// 转化为对象

QJsonObject object = doucment.object();

// 包含指定的 key

if (object.contains("success")) {

// 获取指定 key 对应的 value

success_value = object.value("success");

qDebug() << "success_value : " << success_value.toBool();

}

// 包含指定的 key

if (object.contains("message")) {

// 获取指定 key 对应的 value

message_value = object.value("message");

qDebug() << "message_value : " << message_value.toString();

}

}

}

}

if(true == success_value.toBool())

{

qDebug() << "数据上传成功";

}

}

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include

#include

#include

#include

#include

#include

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

public slots:

void replyFinished(QNetworkReply *reply);

private:

Ui::MainWindow *ui;

QString baseUrl ;

QJsonObject json;

QByteArray dataArray ;

QNetworkRequest request;

QNetworkAccessManager *manager ;

QVariant variant ;

};

#endif // MAINWINDOW_H

1.6、在PC上的运行结果

数据成功上传。

二、在PC Linux下需要注意的地方

貌似没有QT JSON的库,所以一用到Json相关库的时候会报找不到当前头文件或者库的错。那也很简单,把上面所有JSON相关的操作函数以及头文件去掉,当我要构建一个JSON数据然后发起post请求的时候只需要:

QByteArray dataArray = "{\"detail\":\"1\",\"type\":\"2\"}" ;

manager->post(request, dataArray);

这样跟JSON库做的方法是一样的,当然你可以百度去下第三方的JSON库,一样也可以实现。

将程序交叉编译后,在周立功的ARM A6G2C(imx6ul上运行)

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include

#include

#include

#include

#include

#include

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

public slots:

void replyFinished(QNetworkReply *reply);

private:

Ui::MainWindow *ui;

QString baseUrl ;

//QJsonObject json;

QByteArray dataArray ;

QNetworkRequest request;

QNetworkAccessManager *manager ;

QVariant variant ;

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

// URL

baseUrl = "http://120.78.136.134:9002/api/explosive/messages";

QUrl url(baseUrl);

// 构造请求头 ===> 包括三个部分 请求方式(POST)、请求URL(baseUrl)、HTTP协议及版本(HTTP/1.1)

request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

request.setUrl(url);

manager = new QNetworkAccessManager(this);

// 连接信号槽

connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));

构造Json数据

dataArray = "{\"detail\":\"1\",\"type\":\"2\"}" ;

// 发送请求

manager->post(request, dataArray);

}

MainWindow::~MainWindow()

{

delete ui;

}

void MainWindow::replyFinished(QNetworkReply *reply)

{

char recvbuffer[128] ;

memset(recvbuffer,0,128);

//1、获取响应状态码

variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

if (variant.isValid()){

sprintf(recvbuffer,"HTTP/1.1 %d OK",variant.toInt());

qDebug() << recvbuffer ;

}

//2、获取响应头

variant = reply->header(QNetworkRequest::ContentTypeHeader);

if (variant.isValid())

qDebug() << variant.toString();

//3、获取响应信息

QByteArray bytes = reply->readAll();

qDebug() << bytes ;

ui->textBrowser->append(bytes);

}

在周立功ARM平台上的运行结果,在执行程序之前需要做如下的操作:

拨号上网

查看ppp节点

测试网络连通性

执行HTTP测试程序

数据成功上传。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值