2014-06-11 3 views
6

मैं एसएसएल-सर्टिफिकेट के फिंगरप्रिंट के आधार पर एजेक्स-अनुरोधों को अस्वीकार करना, निरीक्षण करना और (यदि आवश्यक हो) को अस्वीकार करना चाहता हूं। मैं अनुरोध जारी करने के लिए QNetworkAccessManager::createRequest(...) फ़ंक्शन का उपयोग करता हूं। जब मैं QWebFrame::load(...) का उपयोग करता हूं तो सब ठीक काम करता है। अनुरोध के भीतर लोड की गई सामग्री (जैसे .css या .js फ़ाइलों) सिग्नल उत्सर्जित करती है। दुर्भाग्यवश कोई AJAX- अनुरोध किसी भी सिग्नल को उत्सर्जित नहीं करता है। मुझे पता है कि सिग्नल MyNetworkAccessManager::createRequest(...) फ़ंक्शन के भीतर एक ही स्लॉट ("सामान्य" के साथ-साथ AJAX- अनुरोधों के लिए) से जुड़े हुए हैं।QtWebKit के भीतर AJAX- अनुरोधों को कैसे रोकें?

QNetworkReply *reply = QNetworkAccessManager::createRequest(op, req, outgoingData); 
connect(reply, SIGNAL(readyRead()), this, SLOT(handleStarted())); 
connect(reply, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(handleSslErrors(const QList<QSslError> &))); 
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleNetworkError())); 

AJAX अनुरोध इतने अलग क्यों हैं? मैं उन्हें कहां एक्सेस कर सकता हूं?

+0

तो, आप एक पृष्ठ प्रदर्शित करने की कोशिश कर रहे हैं, जिसमें कुछ जावास्क्रिप्ट कोड है जो AJAX का उपयोग करके कुछ अन्य जानकारी का अनुरोध करता है? क्या आप यही कर रहे हैं? –

+0

नहीं, मैं एसएसएल फिंगरप्रिंट मिलान के लिए सर्वर के एसएसएल प्रमाणपत्र का उपयोग करना चाहता हूं – Senad

उत्तर

2

मैं जो कह सकता हूं उससे, AJAX अनुरोध QNetworkAccessManager पर समाप्त सिग्नल को छोड़ देता है।

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'); });"); 

तो तुम इतनी तरह replyFinished स्लॉट में उत्तर निगरानी कर सकते हैं:

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; 
} 

मैं पाया है कि jQuery AJAX ने किया वादा नहीं करता आप अपने QWebPage उदाहरण QNetworkAccessManager पर के कहने से कनेक्ट की जरूरत है जब आप QNetworkReply के साथ कुछ भी करते हैं तो निष्पादित प्रतीत होता है, लेकिन आप देख सकते हैं कि अनुरोध वास्तव में डीबग कंसोल में समाप्त होता है।

मेरी GitHub भंडार ऊपर कोड आज़माने के लिए देखें: https://github.com/pcmantinker/QtWebkitAJAX

जहाँ तक SSL प्रमाणपत्र के आधार पर कनेक्शन अवरुद्ध के रूप में, आप QNetworkAccessManager उपवर्ग और QNetworkAccessManager :: createRequest ओवरराइड करना होगा। ऐसा कुछ काम कर सकता है:

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; 
} 
संबंधित मुद्दे