简介
项目需求,在Qt软件下使用restful网络通信接口,进行json数据传输,主要包括了读取和发送数据,使用c++编程
restful网络通信模块
个人理解restful网络通信就是使用http://localhost:8080这种通信格式,
TCP通行就是用IP+端口号进行通信,仅仅是个人最简单的理解~
代码编写
客户端
在头文件中定义
private:
Ui::Widget *ui;
WSADATA mWasData;
SOCKET mSocket;
QString mAddrStr;
QString url;
代码中通信部分,get请求
// 创建QNetworkAccessManager对象
QNetworkAccessManager* manager = new QNetworkAccessManager(this);
// 构造HTTP请求
QNetworkRequest request((QUrl(url)));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QJsonObject json;
QByteArray postData = QJsonDocument(json).toJson();
// 发送HTTP get请求
QNetworkReply* reply = manager->get(request);
connect(reply, &QNetworkReply::finished, this,[=](){
if (reply->error() == QNetworkReply::NoError) {
//连接成功
}
else{
//连接失败
}
代码中通信部分,post请求
// 创建QNetworkAccessManager对象
QNetworkAccessManager* manager = new QNetworkAccessManager(this);
// 构造HTTP请求
QNetworkRequest request((QUrl(url)));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QJsonObject json;
json.insert("message", message);//message是自己给的
QByteArray postData = QJsonDocument(json).toJson();
// 发送post请求
QNetworkReply* reply = manager->post(request,postData);
connect(reply, &QNetworkReply::finished, this,[=]() {
if (reply->error() == QNetworkReply::NoError) {
//连接成功
}
else{
//连接失败
}
}
服务端
头文件
class RestfulServer : public QTcpServer {
Q_OBJECT
public:
RestfulServer(QObject *parent = nullptr) : QTcpServer(parent) {}
private:
void incomingConnection(qintptr socketDescriptor) override;
};
source文件
void RestfulServer::incomingConnection(qintptr socketDescriptor) {
// Create a new socket
QTcpSocket *socket = new QTcpSocket(this);
socket->setSocketDescriptor(socketDescriptor);
// Read the HTTP request
socket->waitForReadyRead();
QByteArray requestData = socket->readAll();
qDebug()<<requestData;
QString requestString(requestData);
QStringList requestLines = requestString.split("\r\n");
// Parse the HTTP request
QString requestMethod = requestLines[0].split(" ")[0];
QString requestUrl = requestLines[0].split(" ")[1];
QJsonObject requestBody;
// Handle the HTTP request and send the response
QJsonObject responseBody;
if (requestMethod == "GET") {
// Handle GET request
responseBody["message"] = "This is a GET request";
} else if (requestMethod == "POST") {
// Handle POST request
responseBody["message"] = "This is a POST request";
responseBody["body"] = requestBody;
} else {
// Handle unsupported request
responseBody["error"] = "Unsupported request method";
}
QJsonDocument responseDoc(responseBody);
QByteArray responseData = responseDoc.toJson(QJsonDocument::Compact);
socket->write("HTTP/1.1 200 OK\r\n");
socket->write("Content-Type: application/json\r\n");
socket->write(QString("Content-Length: %1\r\n").arg(responseData.size()).toUtf8());
socket->write("\r\n");
socket->write(responseData);
socket->flush();
// Close the socket
socket->waitForBytesWritten();
socket->disconnectFromHost();
// 建立连接代码
if (socket->state() == QAbstractSocket::ConnectedState) {
socket->waitForDisconnected();
}
delete socket;
}
Json数据读取和发送——Json文件组成和解析方法
(1)使用QJsonObject,QJsonDocument ,QString 之间的转化和使用
QString parseData_type(const QString& jsonString) {
QJsonDocument jsonResponse = QJsonDocument::fromJson(jsonString.toUtf8());
QJsonObject jsonObject = jsonResponse.object();
QString dataType = jsonObject.value("message").toString();
QJsonObject messageObject = QJsonDocument::fromJson(dataType.toUtf8()).object();
QJsonObject interFaceFile = messageObject.value("InterFaceFile").toObject();
QJsonObject fileHeader = interFaceFile.value("FileHeader").toObject();
QString data_type = fileHeader.value("Data_type").toString();
return data_type;
}
上面的代码目的是解析Json文件中的数据。
(2)下面的代码显示QJsonArray用法
QJsonValue jsonValue(QString::fromStdString(zzghboshu.angleList[i].time.ToString()));
上面的代码把string类型转化为QJsonValue 类型,因为string类型不能直接使用append函数加到QJsonArray中
QJsonArray OuterArray;
QJsonObject outObj;
outObj["Moment"] = jsonValue;
outObj["Pitch_angle"] =zzghboshu.angleList[i].angle.pitch;
outObj["Yaw_angle"] = zzghboshu.angleList[i].angle.yaw;
OuterArray.append(outObj);
QJsonArray可以把QJsonObject塞进去,组成一个数组结构