© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
24 июля 2018 г. 8:52

Qt Android. POST запросы, как отправить и принять

Добрый день) Столкнулся с такой ситуацией. Нужно отправить HTTP запрос используя POST запрос. Написал маленький код в посмотрев видео урок про QNetworkAccessMeneger.Но запрос идет но обратно ничего не получаю. Точнее получаю пустой файл.
Там только был пример про скачивания файла с помощи GET запроса.


Можете пожалуйста написать маленький код на тему как отправить и принять POST запрос. Буду очень благодарен)

  • #
  • 24 июля 2018 г. 10:37

Я разобрался) Слепил и она рабоnает. Отправляет, это хорошо. Но есть одно маленькое но ....не знаю как получить header ответа POST


database.h


#ifndef DATABASE_H
#define DATABASE_H
#include <QObject>
#include <QDebug>
#include <QGuiApplication>
#include <QQuickView>
#include <QQmlContext>
#include <QDebug>
#include <QtSql>
#include "QtSql/QSqlDatabase"
#include "QSqlQuery"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

class database: public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString myMail      READ  getSomePropertyMail       WRITE setSomePropertyMail       NOTIFY  sendToMail)     //Для обменна даными о пройденном пути
    Q_PROPERTY(QString myPassword  READ  getSomePropertyPassword   WRITE setSomePropertyPassword   NOTIFY  sendToPassword)     //Для обменна даными о времени записи трека

public:
    explicit database(QObject *parent = 0);

    QString getSomePropertyMail()const;                                                         //Для обменна даными о времени t
    void    setSomePropertyMail(const QString &);                                                  //Для обменна даными о времени t

    QString getSomePropertyPassword()const;                                                          //Для обменна даными о расстоянии m
    void    setSomePropertyPassword(const QString &);                                                   //Для обменна даными о расстоянии m

signals:
    void finished();
    void sendToMail(QString);                                                                    //Сигналы для передачи пути
    void sendToPassword(QString);                                                                   //Сигналы для передачи данных о времени
    void readyRead();

public slots:

    void getReplyFinished();
    void open_users();
    void readyReadReply();

private:
    QSqlDatabase            db;
    QString                 myMail;
    QString                 myPassword;
    QNetworkAccessManager   manager;
    QNetworkReply           *reply;
    QUrl                    apiUrl;
    QByteArray              requestString;

};

#endif

database.cpp
#include "database.h"
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QFile>
#include <QUrl>
#include <QDebug>
#include <QHttpPart>
#include <QByteArray>
#include <QObject>
#include <QDebug>
#include <QTime>
#include "QtSql/QSqlDatabase"
#include <QtSql/QSql>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QTime>
#include <QLocale>
#include <QDateTime>
#include <QtMath>
#include "QSqlQuery"
#include <QtSql>

database::database(QObject *parent): QObject(parent)
{

}

void database::setSomePropertyMail(const QString &i)                                      //Для обменна даными с переменной way
{
    myMail = i;
    emit sendToMail(myMail);
}

QString database::getSomePropertyMail()const                                              //Для обменна даными с переменной way
{
    return myMail;
}

void database::setSomePropertyPassword (const QString &i)                                     //Для обменна даными с переменной time
{
    myPassword = i;
    emit sendToPassword(myPassword);
}

QString database::getSomePropertyPassword()const                                             //Для обменна даными с переменной time
{
    return myPassword;
}

void database::open_users()
{
    qDebug()<<"Прошел"<<endl;
    apiUrl =  "https://******************";
    requestString = "*********************";

    QNetworkRequest request(apiUrl);
   qDebug()<<"Прошел"<<endl;
    request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));
    qDebug()<<"Прошел"<<endl;
    reply = manager.post(request, requestString);

    connect(reply, SIGNAL(finished()),this, SLOT(getReplyFinished()));
    connect(reply, SIGNAL(finished()), this, SLOT(readyReadReply()));
}
void database::getReplyFinished(){
    reply->deleteLater();
}

void database::readyReadReply(){
   QString answer = QString::fromUtf8(reply->readAll());
   qDebug()<<"Прошел1"<<endl;
   qDebug()<<answer<<endl;
   qDebug()<<"Прошел1"<<endl;
}

  • #
  • 24 июля 2018 г. 10:39

результат компиляции

Добрый день!

Поздравляю с решением проблемы.
Что касается заголовка, то QNetworkReply имеет методы
  • header(QNetworkRequest::KnownHeaders header) const
  • rawHeader(const QByteArrae& headerName) const
  • rawHeaderList() const
Мрожете через них получить информацию из заголовка ответа.





Для Django рекомендую VDS-хостинг TIMEWEB

Спасибо большое) за помощь)

  • #
  • 25 июля 2018 г. 11:40

очень интересно....с компьютера она получает ответ от сервера. Но когда пытаюсь отправить запрос с мобильного телефона то приходит пустот.... не подскажите в чем ошибка? может это из-за того что для Androida в Qt есть какой то другой способ приняться заголовок?

#include "enter_system.h"
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QFile>
#include <QUrl>
#include <QDebug>
#include <QHttpPart>
#include <QByteArray>

Enter_system::Enter_system(QObject *parent): QObject(parent)
{

}

void Enter_system::getData(QString myMail, QString myPassword)
{
    qDebug()<<"Прошел"<<endl;
    QString l1 = "j_username=" + myMail;
    QString p1 = "j_password=" + myPassword;
    result = l1 + "&" + p1;
    QByteArray array;
    array.append(result);
    apiUrl =  "https:*******************";
    requestString = array;

    QNetworkRequest request(apiUrl);
    request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));

    reply = manager.post(request, requestString);

    connect(reply, SIGNAL(finished()),this, SLOT(getReplyFinished()));
    connect(reply, SIGNAL(finished()), this, SLOT(readyReadReply()));
}

void Enter_system::getReplyFinished(){
    reply->deleteLater();
}

void Enter_system::readyReadReply(){
    QString answer = QString::fromUtf8(reply->readAll());
    QList<QByteArray> headerList = reply->rawHeaderList();
    QByteArray head;
    foreach(head, headerList) {
        qDebug() << head << ":-" << reply->rawHeader(head);
    }
    qDebug() <<"headerList = " <<head << ":-" << reply->rawHeader(head);
    QString zapros = reply->rawHeader(head);

    if(zapros == "http://***********/login"){
        myOpen = "Данный пользователь онлайн";
        sendToOpen(myOpen);
        qDebug()<<"Данный пользователь онлайн";
    }else{
        if(zapros == "http://*************")
        {
            myOpen = "true";
            sendToOpen(myOpen);
            qDebug()<<"Авторизация прошла успешно";
        }
        else{
            myOpen = "Отсутствует подключение к сети";
            sendToOpen(myOpen);
            qDebug()<<"Отсутствует подключение к сети"<< zapros;
        }
    }

    //qDebug()<<"headerList = "<<head<<endl;
    qDebug()<<"Прошел1"<<endl;
}

void Enter_system::setSomePropertyMail(const QString &i)                                      //Для обменна даными с переменной way
{
    myMail = i;
    emit sendToMail(myMail);
}

QString Enter_system::getSomePropertyMail()const                                              //Для обменна даными с переменной way
{
    return myMail;
}

void Enter_system::setSomePropertyPassword (const QString &i)                                 //Для обменна даными с переменной time
{
    myPassword = i;
    emit sendToPassword(myPassword);
}

QString Enter_system::getSomePropertyPassword()const                                          //Для обменна даными с переменной time
{
    return myPassword;
}

void Enter_system::setSomePropertyOpen (const QString &i)                                     //Для обменна даными с переменной time
{
    myOpen = i;
    emit sendToPassword(myOpen);
}

QString Enter_system::getSomePropertyOpen()const                                              //Для обменна даными с переменной time
{
    return myOpen;
}


Честно говоря не совсем знаю, какой там подвох может быть.

На ПК используете OpenSSl библиотеку?

Для Django рекомендую VDS-хостинг TIMEWEB

Нет, OpenSSl библиотеку не использую. А ее нужно использовать ?  Я на другом телефоне тоже запустил и там похожая ситуация.

По идее, вам понадобится openSSL, когда будете использовать подключения по https...

Правда, под Андроид я не пробовал запускать эту библиотеку, да и времени пока на жто нет


Для Django рекомендую VDS-хостинг TIMEWEB

Спасибо)

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
15 октября 2018 г. 21:36
Allyans .

C++ - Тест 001. Первая программа и типы данных

  • Результат 60баллов,
  • Очки рейтинга-1
15 октября 2018 г. 11:25
Екатерина Самойлова

C++ - Тест 002. Константы

  • Результат 33баллов,
  • Очки рейтинга-10
15 октября 2018 г. 11:17
Екатерина Самойлова

C++ - Тест 006. Перечисления

  • Результат 80баллов,
  • Очки рейтинга4
Последние комментарии
10 октября 2018 г. 9:50
Евгений Легоцкой

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

Если и начинать писать о плагинах, то нужно тогда с Qt Creator начинать, там наверняка будет одинаковый принцип, но по Qt Creator хотя бы информация есть.
10 октября 2018 г. 9:48
ost.vld

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

О плагинах к QtCreator в целом, тоже интересно.
10 октября 2018 г. 9:46
ost.vld

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

ну типа того, создание программы, функционал которой можно расширять плагинами, и, в перспективе, создание API.
10 октября 2018 г. 8:31
Евгений Легоцкой

Qt/C++ - Урок 083. Создание динамической библиотеки и подключение её в другой проект

Типо как в Qt Creator? Самому бы интересно было о таком почитать. В данный момент я бы мог написать только о написании плагинов для Qt Designer. С этим есть некоторый опыт.
Сейчас обсуждают на форуме
15 октября 2018 г. 12:45
Allyans .

QGraphicsItem change color

Хорошо)
11 октября 2018 г. 10:13
Arrow

Работа с WebView в QML

Нашел в чем проблема. Пишу на случай если кому-то попадется такое же счастье с WebView как и мне. Проблема как оказалась с Debug версией, так как в Release и Profile все работает (...
10 октября 2018 г. 12:49
Виталий Антипов

Кто что делает на Qt?

Работаем по локальной сети. Файл базы, схемы и фото лежат на сервере. Чтобы не было проблем при одновременной работе с одним файлом, все запросы обернул в транзакции, как указано в документаци...
10 октября 2018 г. 11:21
Arrow

Редактирование записи на форуме

Добрый день! К сожалению встретил небольшой баг на форуме. При создании записи на форуме и вставке кода, через соответствующую кнопку номера строк проставляются верно, но каждый...
10 октября 2018 г. 9:46
Arrow

Настройка Qt Creator для Android

Я Genymotion  ставил с VBox в комплекте для личного использования, после добавил из списка телефон с нужным API. Запустил его и при компиляции Qt Creator сам нашел его и все запустилось...
Присоединяйтесь к нам в социальных сетях