Từ những gì tôi có thể biết, yêu cầu AJAX phát ra tín hiệu đã hoàn thành trên QNetworkAccessManager. Bạn cần kết nối với trường hợp của QNetworkAccessManager trên dụ QWebPage của bạn:
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'); });");
Sau đó, bạn có thể giám sát trả lời trong khe replyFinished như vậy:
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;
}
tôi đã nhận thấy rằng lời hứa done jQuery AJAX của không dường như thực thi khi bạn làm bất cứ điều gì với QNetworkReply, nhưng bạn có thể thấy rằng yêu cầu thực sự kết thúc trong bảng điều khiển gỡ lỗi.
Xem kho GitHub của tôi để thử đoạn code trên: https://github.com/pcmantinker/QtWebkitAJAX
Theo như chặn các kết nối dựa trên giấy chứng nhận SSL, bạn sẽ phải phân lớp QNetworkAccessManager và ghi đè QNetworkAccessManager :: createRequest. Một cái gì đó như thế này có thể hoạt động:
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;
}
Nguồn
2014-07-01 15:29:33
Vì vậy, bạn đang cố gắng hiển thị một trang có chứa mã javascript yêu cầu một số thông tin khác bằng AJAX? Đó là những gì bạn đang làm? –
không, tôi muốn truy cập Chứng chỉ SSL của Máy chủ, để khớp với vân tay SSL – Senad