DiagramDesigner/diagramCommunication/source/httpChannel.cpp

144 lines
3.6 KiB
C++
Raw Normal View History

2025-12-12 17:46:37 +08:00
// HttpChannel.cpp
#include "httpChannel.h"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QAuthenticator>
#include <QDebug>
HttpChannel::HttpChannel(const ChannelConfig& config, QObject* parent)
: BaseChannel(config, parent)
{
}
bool HttpChannel::connect()
{
// HTTP无需建立持久连接
emit connected();
return true;
}
bool HttpChannel::disconnect()
{
// HTTP无需断开持久连接
emit disconnected();
return true;
}
bool HttpChannel::isConnected() const
{
return m_config.endpoint.isValid(); // 只要端点有效就认为"可连接"
}
bool HttpChannel::send(const QByteArray& data)
{
return post(data);
}
bool HttpChannel::get(const QString& path)
{
if (!m_config.endpoint.isValid()) {
emit errorOccurred("Invalid endpoint");
return false;
}
QUrl url = m_config.endpoint;
if (!path.isEmpty()) {
url.setPath(url.path() + "/" + path);
}
QNetworkAccessManager* manager = new QNetworkAccessManager(this);
QObject::connect(manager, &QNetworkAccessManager::authenticationRequired,
[this](QNetworkReply* reply, QAuthenticator* authenticator) {
if (!m_username.isEmpty() && !m_password.isEmpty()) {
authenticator->setUser(m_username);
authenticator->setPassword(m_password);
}
});
QNetworkRequest request(url);
// 设置头
for (auto it = m_headers.begin(); it != m_headers.end(); ++it) {
request.setRawHeader(it.key().toUtf8(), it.value().toUtf8());
}
QNetworkReply* reply = manager->get(request);
QObject::connect(reply, &QNetworkReply::finished, [this, reply, manager]() {
if (reply->error() == QNetworkReply::NoError) {
QByteArray data = reply->readAll();
emit dataReceived(data);
} else {
emit errorOccurred(reply->errorString());
}
reply->deleteLater();
manager->deleteLater();
});
return true;
}
bool HttpChannel::post(const QByteArray& data, const QString& path)
{
if (!m_config.endpoint.isValid()) {
emit errorOccurred("Invalid endpoint");
return false;
}
QUrl url = m_config.endpoint;
if (!path.isEmpty()) {
url.setPath(url.path() + "/" + path);
}
QNetworkAccessManager* manager = new QNetworkAccessManager(this);
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
for (auto it = m_headers.begin(); it != m_headers.end(); ++it) {
request.setRawHeader(it.key().toUtf8(), it.value().toUtf8());
}
QNetworkReply* reply = manager->post(request, data);
QObject::connect(reply, &QNetworkReply::finished,this,[this, reply, manager]() {
if (reply->error() == QNetworkReply::NoError) {
QByteArray data = reply->readAll();
emit dataReceived(data);
} else {
emit errorOccurred(reply->errorString());
}
reply->deleteLater();
manager->deleteLater();
});
return true;
}
bool HttpChannel::put(const QByteArray& data, const QString& path)
{
// 类似post的实现
return post(data, path); // 简化处理
}
bool HttpChannel::deleteResource(const QString& path)
{
// 类似get的实现
return get(path); // 简化处理
}
void HttpChannel::setBasicAuth(const QString& username, const QString& password)
{
m_username = username;
m_password = password;
}
void HttpChannel::setHeader(const QString& name, const QString& value)
{
m_headers[name] = value;
}