2016-11-02 82 views
2

我正在開發一個項目,要求我將JSON請求發佈到API服務器,然後從服務器接收數據。然而,我無法讓它工作。這是我的代碼在Qt 4.7中發佈JSON請求

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QUrl serviceUrl = QUrl("https://www.jusmine.jp/KA/KGBloginCheck"); 
    QNetworkRequest request(serviceUrl); 
    QJsonObject json; 
    json.insert("userid","xxxx"); 
    json.insert("userpass","xxxx");  
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json"); 
    request.setHeader(QNetworkRequest::ContentLengthHeader,QByteArray::number(json.size())); 
    QNetworkAccessManager *networkManager = new QNetworkAccessManager(this); 
    connect(networkManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(serviceRequestFinish(QNetworkReply*))); 
    networkManager->post(request,QJsonDocument(json).toJson()); 
} 
void MainWindow::serviceRequestFinish(QNetworkReply *rep) 
{ 
    QString strReply = (QString)rep->readAll(); 
    qDebug()<<"Test: "<<strReply; 
} 

運行程序後,我從服務器上得不到任何東西。 (這段代碼是建立在Qt 4.7.0上的,所以我必須使用庫qjson4-master)。我不知道有沒有人可以幫助我解決這個問題。

這是測試服務器API的結果: screenshot

+0

你確定服務器正在發回任何數據嗎?你能否使用其他工具收到回覆?嘗試添加'qDebug()<< rep->錯誤();'到'serviceRequestFinish'並編輯您的問題與打印的錯誤。 – Mike

+0

加入qDebug()後出現錯誤()<< rep->,程序只打印「0」。正如我在這個網絡API的規範中所看到的,這個API要求我使用「POST HTTP方法」,上下文類型是「application/json」。我不知道上面實現的代碼是否滿足這些要求。 –

+0

如果程序爲'rep-> error()'輸出'0',那麼這意味着['QNetworkReply :: NoError'](https://doc.qt.io/qt-4.8/qnetworkreply.html#NetworkError-enum )。在代碼中,你使用的是POST,並且內容類型頭部被設置爲「application/json」,應該沒有問題。 – Mike

回答

2

你正在一個錯誤的方式計算ContentLengthHeader

request.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(json.size())); 

請注意,QJsonObject::size()返回存儲(鍵,值)對數在對象中(而不是其文本表示的長度)。顯然,標題應該等於內容的長度而不是其(鍵,值)對的數量。

中的代碼你MainWindow的構造應該是這個樣子:

QUrl serviceUrl = QUrl("https://www.jusmine.jp/KA/KGBloginCheck"); 
QNetworkRequest request(serviceUrl); 
QJsonObject json; 
json.insert("userid","xxxx"); 
json.insert("userpass","xxxx");  
QJsonDocument jsonDoc(json); 
QByteArray jsonData= jsonDoc.toJson(); 
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json"); 
request.setHeader(QNetworkRequest::ContentLengthHeader,QByteArray::number(jsonData.size())); 
QNetworkAccessManager networkManager; 
connect(networkManager, SIGNAL(finished(QNetworkReply*)), 
     this, SLOT(serviceRequestFinish(QNetworkReply*))); 
networkManager.post(request, jsonData); 

側面說明:沒有必要計算Content-Length頭自己,Qt的添加此標頭如果你沒有指定一個,請參閱實施here。所以,您可以省略添加此標題的行。


我想從服務器獲取的狀態爲 「200」。我怎樣才能得到這個數字?

在你serviceRequestFinish插槽,使用QNetworkReply::attribute()

qDebug() << rep->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 

這應該打印200如果你的要求是確定的。