Why the post method doesn't send the json to API Rest in QT5?



  • Hi, I'm trying to send a json via a post request in Qt5. This is my situation. I have a Parser class that takes a QByteArray, always with different values, from another class through the SIGNAL and SLOT mechanism. But I want to take only certain values, which when taken, send them to another method of the same Parser class where sending them to API Rest. Unfortunately the json is not sent to my app.
    This is my parser.h

    ...
    class Parser : public QObject
    {
        Q_OBJECT
    
    public:
        Parser();
    
    public slots:
        void receivePackage(QByteArray &sendBuffer);
        void replyFinished(QNetworkReply *reply);
        void slotError(QNetworkReply::NetworkError code);
    
    public:
        QByteArray bufferToParse;
        QByteArray bufferToPacket;
        QQueue<QByteArray> queue;
        void sendPacketToAPI(QByteArray &bufferToPacket);
    
    private:
        QNetworkAccessManager *m_manager;
        quint8 m_speed;
        quint8 m_acceleration;
    };
    ...
    

    This is my parser.cpp

    Parser::Parser()
        : m_manager { new QNetworkAccessManager }
    {
            connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
    }
    
    void Parser::receivePackage(QByteArray &sendBuffer){
        queue.enqueue(sendBuffer);
        while (!queue.isEmpty()) {
            bufferToParse = queue.dequeue();
            ...
            for (int i = 6; i < 262; i++) {
                bufferToPacket.append(bufferToParse.at(i));
            }
        sendPacketToAPI(bufferToPacket);
        ...        
    }
    
    void replyFinished(QNetworkReply *reply)
    {
        reply->deleteLater();
        qDebug() << "reply delete!";
        qDebug() << "https post_request done!";
    }
    
    
    void Parser::sendPacketToAPI(QByteArray &bufferToPacket) {
        m_a = bufferToPacket.at(0);
        m_b = bufferToPacket.at(1);
        QNetworkRequest request(QUrl ("https://..."));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
        QString json = QString("{\"speed\":\"%1\",\"acceleration\":\"%2\"}").arg(m_a).arg(m_b);
        m_manager->post(request, json.toUtf8());
    }
    

  • Moderators

    @trip The API must have returned back the error ?



  • @p3c0 the strange thing is that I do not back any mistakes ... even from server logs


  • Moderators

    @trip What does reply->errorString() print in your replyFinished slot ?



  • @p3c0 in connect I can not get in, I do not know why.
    I did

    ...
    QNetworkReply *reply = m_manager->post(request, json.toUtf8());
    qDebug() << "~error" << reply->errorString();
    ...
    

    and gives me "Unknown error".


  • Moderators

    @trip Check the error in replyFinished slot. You have already connected to the finished signal.

    connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
    


  • @p3c0 I know that it is already connected, and I understood what you say but the code does not seem to execute that piece of code. it is as if the SIGNAL and SLOT not communicated with


  • Moderators

    @trip It can take time for the reply to be returned.



  • @p3c0 I left it running for a while, but the replyFinished method seems as if it were not called


  • Moderators

    @trip
    since it looks like you are posting to a https url, do you have OpenSSL properly configured?



  • @raven-worx
    No, I have not configured. Do you think is the problem?


  • Moderators

    @trip
    yes ;)
    But you should get some SSL errors printed in the debugger console (during initialization)

    On what system are you developing on?



  • @raven-worx
    Okay. What is the right flow to follow to configure OpenSSL correctly?
    In fact I like errors

    qt.network.ssl: QSslSocket: can not resolve SSLv2_client_method
    qt.network.ssl: QSslSocket: can not resolve SSLv2_server_method
    

    I'm using Ubuntu 16 and Qt Creator 4


  • Moderators

    @trip
    yea, about those errors i was talking.
    Since you are on Ubuntu simply install the OpenSSL binaries (via the system package manager) and it should work.



  • @raven-worx
    I had already installed the package. I run the program but I always make the same error.



  • @raven-worx
    Should I use the connectToHostEncrypted method of the QNetworkAccessManager class?



  • @trip For using https enough call message get/put/post with https urls, for example

    QNetworkRequest req;
    req.setUrl(QUrl("https://cloud-api.yandex.net/v1/disk/"));
    

    and this is working in my program.


  • Moderators

    @trip

    it has to be in a path where your application can find it.

    no not needed. Should all happen internally. Just make sure your application can find the OpenSSL binaries.



  • @raven-worx for example, we can put together with the executable file.



  • @raven-worx
    I tried to do another project where there is just main.cpp and where do

    #include <QCoreApplication>
    #include <QNetworkAccessManager>
    #include <QNetworkReply>
    #include <QNetworkRequest>
    #include <QDebug>
    #include <QObject>
    #include <QByteArray>
    #include <QUrl>
    
    
    void replyFinished(QNetworkReply *reply)
    {
        reply->deleteLater();
        qDebug() << "reply delete!";
        qDebug() << "https post_request done!";
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QNetworkAccessManager *manager = new QNetworkAccessManager();
    
        QNetworkRequest request(QUrl ("https://cryptic-reaches-94837.herokuapp.com/data/"));
    
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    
        QObject::connect(manager, &QNetworkAccessManager::finished, replyFinished);
    
        quint8 speed = 0x12;
        quint8 acceleration = 0x5b;
    
        QString json = QString("{\"speed\":\"%1\",\"acceleration\":\"%2\"}").arg(speed).arg(acceleration);
    
        manager->post(request, json.toUtf8());
    
        return a.exec();
    }
    

    and it's work!!!
    but how come if add this piece of code to my project, why does not work to me?


  • Moderators

    @trip
    but thats a different URL now?!
    Check the returned response error again.



  • @raven-worx
    not only here I left explicit



  • @raven-worx
    I think the problem of my code is that networking events are not processed by QCoreApplication :: exec () and then, because the execution is always nested in the cycles and never returns to the main unless there is an error , I do not run networking events. How can I solve this problem?


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.