207 lines
6.8 KiB
C++
207 lines
6.8 KiB
C++
#include "cloudalgorithmaccess.h"
|
||
#include <QDebug>
|
||
#include <QEventLoop>
|
||
#include <QTimer>
|
||
#include <QApplication>
|
||
#include <QDir>
|
||
#include <QtNetwork/QTcpSocket>
|
||
#include <QtNetwork/QNetworkProxy>
|
||
|
||
CloudAlgorithmAccess::CloudAlgorithmAccess(QObject *parent) : QObject(parent)
|
||
{
|
||
m_tcpSocket = new QTcpSocket(this);
|
||
m_responseResult.clear();
|
||
|
||
}
|
||
|
||
QByteArray CloudAlgorithmAccess::sendHttpPost(const QString &host, int port, const QString &path, const QByteArray &data)
|
||
{
|
||
// 连接服务器
|
||
m_tcpSocket->connectToHost(host, port);
|
||
if (!m_tcpSocket->waitForConnected(5000)) {
|
||
qDebug() << "Connection failed!";
|
||
return QByteArray(); // 连接失败
|
||
}
|
||
|
||
// 构建HTTP请求
|
||
QByteArray request =
|
||
"POST " + path.toUtf8() + " HTTP/1.1\r\n" +
|
||
"Host: " + host.toUtf8() + "\r\n" +
|
||
"Content-Type: application/json\r\n" +
|
||
"Content-Length: " + QByteArray::number(data.length()) + "\r\n" +
|
||
"Connection: close\r\n" +
|
||
"\r\n" +
|
||
data;
|
||
|
||
// 发送请求
|
||
m_tcpSocket->write(request); // 将request数据写入套接字的写缓冲区,并尝试发送。
|
||
m_tcpSocket->waitForBytesWritten(5000); // 等待直到数据被实际发送(即写入网络)或超时5秒。
|
||
|
||
// 等待响应
|
||
QByteArray response;
|
||
while ( m_tcpSocket->waitForReadyRead(5000)) {
|
||
response.append(m_tcpSocket->readAll());
|
||
if (m_tcpSocket->bytesAvailable() == 0 && ! m_tcpSocket->isValid()) {
|
||
break;
|
||
}
|
||
}
|
||
|
||
m_tcpSocket->close();
|
||
|
||
// 提取响应体(跳过HTTP头)尝试标准分隔符 \r\n\r\n
|
||
int headerEnd = response.indexOf("\r\n\r\n");
|
||
if (headerEnd != -1) {
|
||
return response.mid(headerEnd + 4);
|
||
}
|
||
// 尝试 \n\n(某些服务器可能使用)
|
||
headerEnd = response.indexOf("\n\n");
|
||
if (headerEnd != -1) {
|
||
return response.mid(headerEnd + 2);
|
||
}
|
||
|
||
// 如果找不到标准分隔符,返回原始内容
|
||
qDebug() << "警告:无法解析HTTP响应格式,返回原始内容";
|
||
return response;
|
||
}
|
||
|
||
///计算孔隙度的json拼接样例
|
||
QString CloudAlgorithmAccess::buildJson(const QVector<double>& depths, const QVector<double>& values)
|
||
{
|
||
QString json = "{";
|
||
json += QString::fromUtf8("\"methodName\":\"根据声波时差计算(默认)\",");
|
||
json += "\"coefficient\":{\"DTpm\":\"49\",\"DTpf\":\"188.9\"},";
|
||
json += "\"curvesInfo\":{\"curveSource\":\"\",\"mdList\":[";
|
||
|
||
// 添加深度数据
|
||
for (int i = 0; i < depths.size(); i++) {
|
||
if (i > 0) json += ",";
|
||
json += QString::number(depths[i]);
|
||
}
|
||
|
||
json += QString::fromUtf8("],\"curveList\":[{\"curveName\":\"纵波时差\",\"minValue\":0,\"maxValue\":0,\"valueList\":[");
|
||
|
||
// 添加声波时差数据
|
||
for (int i = 0; i < values.size(); i++) {
|
||
if (i > 0) json += ",";
|
||
json += QString::number(values[i]);
|
||
}
|
||
|
||
json += "]}]}}";
|
||
qDebug() << "json:" << json;
|
||
|
||
return json;
|
||
}
|
||
|
||
|
||
// 解析JSON数据的函数
|
||
int CloudAlgorithmAccess::parseResponseData(QString jsonData) {
|
||
//QString jsonData = QString::fromUtf8(data);
|
||
m_responseResult.clear();
|
||
int result = ParseSuccess;
|
||
|
||
// 检查响应码
|
||
int codePos = jsonData.indexOf("\"code\":");
|
||
if (codePos == -1) {
|
||
result = ParseNoCode;
|
||
return result;
|
||
}
|
||
|
||
int codeStart = jsonData.indexOf(":", codePos) + 1;
|
||
int codeEnd = jsonData.indexOf(",", codeStart);
|
||
QString codeStr = jsonData.mid(codeStart, codeEnd - codeStart).trimmed();
|
||
|
||
int code = codeStr.toInt();
|
||
if (code != 200) {
|
||
result = ParseCodeError;
|
||
return result;
|
||
}
|
||
|
||
// 查找data数组开始位置
|
||
int dataStartPos = jsonData.indexOf("\"data\":[");
|
||
if (dataStartPos == -1) {
|
||
result = ParseDataError;
|
||
return result;
|
||
}
|
||
|
||
dataStartPos = jsonData.indexOf("[", dataStartPos) + 1;
|
||
|
||
// 解析每个数据项
|
||
int pos = dataStartPos;
|
||
while (pos < jsonData.length()) {
|
||
// 查找对象开始
|
||
int objStart = jsonData.indexOf("{", pos);
|
||
if (objStart == -1) break;
|
||
|
||
// 查找对象结束
|
||
int objEnd = jsonData.indexOf("}", objStart);
|
||
if (objEnd == -1) break;
|
||
|
||
QString objStr = jsonData.mid(objStart, objEnd - objStart + 1);
|
||
|
||
ResponseData data;
|
||
|
||
// 解析depth字段
|
||
int depthPos = objStr.indexOf("\"depth\":");
|
||
if (depthPos != -1) {
|
||
int depthStart = objStr.indexOf(":", depthPos) + 1;
|
||
int depthEnd = objStr.indexOf(",", depthStart);
|
||
if (depthEnd == -1) depthEnd = objStr.indexOf("}", depthStart);
|
||
QString depthStr = objStr.mid(depthStart, depthEnd - depthStart).trimmed();
|
||
data.depth = depthStr.toDouble();
|
||
}
|
||
|
||
// 解析value字段
|
||
int valuePos = objStr.indexOf("\"value\":");
|
||
if (valuePos != -1) {
|
||
int valueStart = objStr.indexOf(":", valuePos) + 1;
|
||
int valueEnd = objStr.indexOf(",", valueStart);
|
||
if (valueEnd == -1) valueEnd = objStr.indexOf("}", valueStart);
|
||
QString valueStr = objStr.mid(valueStart, valueEnd - valueStart).trimmed();
|
||
data.value = valueStr.toDouble();
|
||
}
|
||
|
||
// 解析overlying_Pressure字段
|
||
int pressurePos = objStr.indexOf("\"overlying_Pressure\":");
|
||
if (pressurePos != -1) {
|
||
int pressureStart = objStr.indexOf(":", pressurePos) + 1;
|
||
int pressureEnd = objStr.indexOf(",", pressureStart);
|
||
if (pressureEnd == -1) pressureEnd = objStr.indexOf("}", pressureStart);
|
||
QString pressureStr = objStr.mid(pressureStart, pressureEnd - pressureStart).trimmed();
|
||
data.overlying_Pressure = pressureStr.toDouble();
|
||
}
|
||
|
||
// 解析dp字段
|
||
int dpPos = objStr.indexOf("\"dp\":");
|
||
if (dpPos != -1) {
|
||
int dpStart = objStr.indexOf(":", dpPos) + 1;
|
||
int dpEnd = objStr.indexOf(",", dpStart);
|
||
if (dpEnd == -1) dpEnd = objStr.indexOf("}", dpStart);
|
||
QString dpStr = objStr.mid(dpStart, dpEnd - dpStart).trimmed();
|
||
data.dp = dpStr.toDouble();
|
||
}
|
||
|
||
// 解析dpTrend字段
|
||
int dpTrendPos = objStr.indexOf("\"dpTrend\":");
|
||
if (dpTrendPos != -1) {
|
||
int dpTrendStart = objStr.indexOf(":", dpTrendPos) + 1;
|
||
int dpTrendEnd = objStr.indexOf(",", dpTrendStart);
|
||
if (dpTrendEnd == -1) dpTrendEnd = objStr.indexOf("}", dpTrendStart);
|
||
QString dpTrendStr = objStr.mid(dpTrendStart, dpTrendEnd - dpTrendStart).trimmed();
|
||
data.dpTrend = dpTrendStr.toDouble();
|
||
}
|
||
|
||
m_responseResult.append(data);
|
||
pos = objEnd + 1;
|
||
|
||
// 检查是否还有下一个对象
|
||
if (jsonData.indexOf("{", pos) == -1) break;
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
const QList<ResponseData> &CloudAlgorithmAccess::getResponseResult() const
|
||
{
|
||
return m_responseResult;
|
||
|
||
} |