QT는 물론 C++에 대한 새로운 경험이 있습니다. 사용자가 버튼을 클릭 할 때 웹 사이트에 POST하는 프로그램을 만들려고하지만 QNetworkManager에 액세스하려고 할 때마다 메모리 액세스 오류가 발생합니다. 내 요청 개체에 대한
코드는 (중요한 비트를 보여주기 위해 약간 손질) 다음과 같습니다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;
}
나는 unifiedRequests 개체를 만드는거야 호출하여 : 다른 파일에
unifiedRequests requestObj;
. SSL을 끄려는 줄에서 충돌이 발생합니다 (자체 서명 된 인증서를 사용하고 있으므로 요청을하기 위해이 작업을 수행해야합니다). 이견있는 사람?
감사합니다.
에 대한 구글 :
은 이쪽을 봐, 차이를 이해하려면? – IAmInPLSconnect() 문의 충돌이 발생 했습니까? 컴파일러 시간 오류를 제공하는 새로운 연결 구문을 시도해 볼 수 있습니다 :'connect (manager, & QNetworkAccessManager :: sslErrors, this, & unifiedRequests :: sslErrorHandler); '하지만 연결에 문제가 없습니다. 또한 QtCreator 디버거 모드로 실행 해 보았습니다 (QtCreator를 사용한다고 가정).이 충돌이 발생한 실제 행을 찾으십니까? - 자세한 내용을 제공 할 수 있습니까? –
"unifiedRequests requestObj;"를 호출하여 unifiedRequests 객체를 만드는 경우 변수 "requestObj"가 범위를 벗어날 때이 객체가 삭제됩니다. 여기에 문제가있을 수 있습니다. "unifiedRequests * requestObj = new unifiedRequests();"를 호출하여 unifiedRequests 개체를 만들어보세요. 문제가 해결되면 "delete requestObj;"를 호출해야합니다. 이 객체를 파괴 할 수있는 곳. 언제 어디서나 귀하의 신청서에 의존하십시오. – Aurelien