qt 模擬表單提交數據

QByteArray HttpUtil::login(const QString url /*= QString()*/, const QString & mobile /*= QString()*/, const QString & password /*= QString()*/)
{
	qDebug() << QStringLiteral("正在登錄...");
	m_Type = "login";
	QNetworkRequest request;
	QSslConfiguration config;
	config.setPeerVerifyMode(QSslSocket::VerifyNone);
	config.setProtocol(QSsl::TlsV1SslV3);
	request.setSslConfiguration(config);
	request.setUrl(QUrl(url));
	request.setRawHeader("os", "windows");
	request.setRawHeader("version", "1.0.0.0");
	request.setRawHeader("appKey", "201820011141153");
	request.setRawHeader("did", "PC-20181206");
	std::string strText = QString("mobile=%1&password=%2").arg(mobile).arg(password).toStdString();

	std::string strSecret = "661ee319dff061d4fb6532787f7b6wgl";
	std::string result = CreateSignature(strText, strSecret);
	request.setRawHeader("signature", result.c_str());

	QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

	QHttpPart textPart;
	textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"mobile\""));
	textPart.setBody(mobile.toUtf8());  //電話號碼 

	QHttpPart textPart2;
	textPart2.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"password\""));
	textPart2.setBody(password.toUtf8()); //密碼

	multiPart->append(textPart);
	multiPart->append(textPart2);

	QByteArray bytes = postData(request, multiPart);
	return bytes;
}

 

 

QByteArray HttpUtil::postData(QNetworkRequest request /*= QNetworkRequest()*/, QHttpMultiPart *  multiPart /*= QHttpMultiPart()*/)
{
	qDebug() << "HttpUtil::getData...";

	//m_networkReply = m_networkAccessManager->post(request, multiPart);
	////bool check = connect(m_networkReply, &QIODevice::readyRead, this, &HttpUtil::onReadyRead);
	//bool check = connect(m_networkReply, &QNetworkReply::finished, this, &HttpUtil::onFinished);
	//check = connect(m_networkAccessManager, &QNetworkAccessManager::sslErrors,
	//	this, &HttpUtil::onSslErrors);
	//return QByteArray();

	QTimer timer;
	timer.setInterval(10000);  // 設置超時時間10秒
	timer.setSingleShot(true);  // 單次觸發
	timer.start(); //啓動定時器
	QNetworkReply * networkReply = m_networkAccessManager->post(request, multiPart);
	multiPart->setParent(networkReply);
	QEventLoop eventLoop;
	connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
	connect(networkReply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
	eventLoop.exec();

	if (timer.isActive())
	{
		timer.stop();
		int code =
			networkReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
		QNetworkReply::NetworkError error = networkReply->error();
		if (error == QNetworkReply::NoError)
		{
			QByteArray byteArray = networkReply->readAll();
			QString string = QString::fromUtf8(byteArray);
			if (networkReply->isFinished())
			{
				networkReply->deleteLater();
				QVariantMap * vm = new QVariantMap();
				vm->insert("type", m_Type);
				vm->insert("data", byteArray);
				vm->insert("result", Result::Ok);
				emit readyRead(vm); //發送數據到 eventQueue
				return byteArray;
			}
		}
		else
		{
			qDebug() << QStringLiteral("網絡請求錯誤,錯位代碼:") << networkReply->error();
		}
	}
	else
	{
		disconnect(networkReply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
		networkReply->abort();
		networkReply->deleteLater();
		qDebug() << QStringLiteral("網絡請求超時...");
	}
	return QByteArray();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章