144 lines
3.6 KiB
C++
144 lines
3.6 KiB
C++
|
|
// 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;
|
||
|
|
}
|