Da quello che posso dire, le richieste AJAX emettono il segnale finito su QNetworkAccessManager. È necessario connettersi all'istanza di QNetworkAccessManager sull'istanza QWebPage:
QWebPage *page = ui->webView->page();
QNetworkAccessManager *nam = page->networkAccessManager();
connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
QFile file;
file.setFileName(":/js/jquery-2.1.1.min.js"); // jQuery is loaded as a resource
file.open(QIODevice::ReadOnly);
QString jQuery = file.readAll();
file.close();
ui->webView->load(QUrl("about:blank"));
QWebFrame *frame = m_page->mainFrame();
frame->evaluateJavaScript(jQuery); // load jQuery
// check that jQuery is loaded
frame->evaluateJavaScript("$(document).ready(function() { alert('jQuery loaded!'); });");
// do an AJAX GET
frame->evaluateJavaScript("$.ajax({"
"url: 'http://www.json-generator.com/api/json/get/cqkXBAEoQy?indent=2',"
"method: 'GET',"
"dataType: 'json'"
"}).done(function (data) {"
"for (var i = 0; i < data.length; i++) {"
"alert(data[i].name);"
"}"
"}).error(function (data) { alert('AJAX error'); });");
Quindi è possibile monitorare le repliche in slot replyFinished in questo modo:
void MainWindow::replyFinished(QNetworkReply *reply)
{
QByteArray bytes = reply->readAll();
QString str = QString::fromUtf8(bytes.data(), bytes.size());
QString replyUrl = reply->url().toString();
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
qDebug() << statusCode;
qDebug() << replyUrl;
qDebug() << str;
}
ho notato che la promessa fatto di jQuery AJAX non lo fa sembra che si esegua quando fai qualcosa con QNetworkReply, ma puoi vedere che la richiesta termina effettivamente nella console di debug.
Vedere il mio repository GitHub per provare il codice di cui sopra: https://github.com/pcmantinker/QtWebkitAJAX
Per quanto riguarda bloccando le connessioni basate su certificati SSL, dovreste sottoclasse QNetworkAccessManager e sovrascrivere QNetworkAccessManager :: createRequest. Qualcosa del genere potrebbe funzionare:
QNetworkReply *CustomQNetworkAccessManager::createRequest(Operation op, const QNetworkRequest& request, QIODevice* outgoingData)
{
QNetworkRequest req(request);
QNetworkReply *reply = QNetworkAccessManager::createRequest(op, req, outgoingData);
QSslConfiguration *sslConfig = reply->sslConfiguration();
QList<QSslCertificate> sslCaCerts = sslConfig->caCertificates();
// do something with sslCaCerts
return reply;
}
fonte
2014-07-01 15:29:33
Quindi, stai provando a visualizzare una pagina, che contiene qualche codice javascript che richiede altre informazioni usando AJAX? È quello che stai facendo? –
no, voglio accedere al certificato SSL del server, per la corrispondenza delle impronte digitali SSL – Senad