Ich bin ziemlich neu in C++ (obwohl ich einige Erfahrung mit C) sowie QT. Ich versuche, ein Programm zu erstellen, das auf eine Website POST sendet, wenn der Benutzer auf eine Schaltfläche klickt, aber wenn ich versuche, auf QNetworkManager zuzugreifen, erhalte ich einen Speicherzugriffsfehler.
Der Code für mein Request-Objekt ist als (leicht die wichtigen Bits zeigen getrimmt) folgt:Speicherzugriffsfehler bei der Verwendung von QNetworkManager
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include "cJSON.h"
class unifiedRequests: public QObject {
Q_OBJECT
public:
// Members
QString access_token = "";
bool admin = false;
// Methods
explicit unifiedRequests(QObject *parent=0);
QNetworkReply* login_request(QString *email, QString *password);
signals:
public slots:
void login_complete(QNetworkReply *reply);
void sslErrorHandler(QNetworkReply*, const QList<QSslError> &);
private:
QNetworkRequest make_headers(QByteArray endpoint);
QNetworkRequest make_headers(QByteArray endpoint, QByteArray *access_token);
};
QNetworkRequest unifiedRequests::make_headers(QByteArray endpoint) {
QString url = endpoint.prepend("https://dali.vpt.co.uk");
QNetworkRequest request = QNetworkRequest(url);
qDebug() << "Setting Headers";
request.setRawHeader("User-Agent", "Desktop Client Debug");
request.setRawHeader("Content-Type", "application/json");
qDebug() << "Set headers successfully.";
return request;
}
void unifiedRequests::sslErrorHandler
(QNetworkReply* reply, const QList<QSslError> & errors) {
qDebug() << "Ignoring SSL Errors";
};
QNetworkReply* unifiedRequests::login_request
(QString *email, QString *password) {
QNetworkRequest request = make_headers("/api/auth");
qDebug() << "Making JSON";
cJSON *login_json; //The body of the request
login_json = cJSON_CreateObject();
cJSON_AddStringToObject(login_json, "email", email->toUtf8());
cJSON_AddStringToObject(login_json, "password", password->toUtf8());
qDebug() << "Made JSON: ";
qDebug() << cJSON_Print(login_json);
QNetworkAccessManager *manager = new QNetworkAccessManager;
//The object we use to send the request and receive the reply
qDebug() << "Turning off SSL";
connect(manager,
SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError> &)),
this,
SLOT(sslErrorHandler(QNetworkReply*, const QList<QSslError> & )));
qDebug() << "POSTing login.";
QNetworkReply *reply = manager->post(request, cJSON_Print(login_json));
qDebug() << "Connecting signal to slot.";
QAbstractSocket::connect(manager, SIGNAL(finished(QNetworkReply *)),
this, SLOT(login_complete(QNetworkReply *)));
cJSON_Delete(login_json);
return reply;
}
Ich bin durch den Aufruf des unifiedRequests Objekt erstellen:
unifiedRequests requestObj;
in einer anderen Datei. Es stürzt in der Zeile ab, in der ich versuche, SSL zu deaktivieren (wir verwenden ein selbstsigniertes Zertifikat, also muss ich dies tun, um die Anfrage zu stellen). Irgendwelche Gedanken?
Danke!
Was meinst du mit "stürzt"? – IAmInPLS
Willst du damit sagen, dass deine connect() - Anweisung abstürzt? Sie könnten die neuere Verbindungssyntax versuchen, die Compiler-Zeitfehler verursacht: 'connect (manager, & QNetworkAccessManager :: sslErrors, this, & unifiedRequests :: sslErrorHandler);' aber ich sehe kein Problem mit Ihrer Verbindung. Haben Sie auch versucht, im QtCreator Debugger-Modus zu laufen (vorausgesetzt, Sie verwenden QtCreator), um die tatsächliche Zeile zu finden, auf der dieser Absturz stattfindet? - Können Sie weitere Details angeben? –
Wenn Sie das Objekt uniquestRequests durch Aufrufen von "unifiedRequests requestObj;" erstellen, wird dieses Objekt gelöscht, wenn die Variable "requestObj" den Gültigkeitsbereich verlässt. Dies könnte Ihr Problem hier sein. Versuchen Sie, Ihr UnifiedRequests-Objekt zu erstellen, indem Sie "unifiedRequests * requestObj = new unifiedRequests();" aufrufen. Wenn es Ihr Problem löst, müssen Sie "delete requestObj;" irgendwo um dieses Objekt zu zerstören. Wo und wann hängt von Ihrer Anwendung ab. – Aurelien