W
24 июля 2018 г. 4:52

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

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


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

Виртуальный хостинг со скидкой 10 процентов
Виртуальный хостинг со скидкой 10 процентов
EVILEG предлагает надёжный хостинг со скидкой 10% на виртуальный хостинг и 5% на VPS
9
W
  • 24 июля 2018 г. 6: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;
}

2
W
  • 24 июля 2018 г. 6:39

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

0

Добрый день!

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





1
W

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

1
W
  • 25 июля 2018 г. 7: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;
}


0

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

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

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

0

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

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


1
W

Спасибо)

1

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
МБ
14 июля 2019 г. 17:57
Максим Беликов

C++ - Тест 005. Структуры и Классы

  • Результат:100баллов,
  • Очки рейтинга10
МБ
14 июля 2019 г. 17:52
Максим Беликов

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:90баллов,
  • Очки рейтинга8
МБ
14 июля 2019 г. 17:45
Максим Беликов

C++ - Тест 003. Условия и циклы

  • Результат:71баллов,
  • Очки рейтинга1
Последние комментарии
16 июля 2019 г. 15:15
Евгений Легоцкой

Конечно )) На самом деле не все читали Шлее... я например не читал ))
16 июля 2019 г. 15:05
IscanderChe

Так пример с QLocalServer и QLocalSocket я целиком переписал с QTcpSocket и QTcpServer из книги Шлее. Принципиальное отличие - где коннект ставить. :)) Разве что на это упор сделать. Но я могу...
16 июля 2019 г. 14:47
Евгений Легоцкой

Лучше API ))) Кстати, по использованию QLocalServer и QLocalSocket на сайте нет статей, было бы очень полезно и хорошо пошло бы в раздел Qt.
16 июля 2019 г. 12:36
IscanderChe

Да, прямой доступ не предполагается. Впрочем, можно, конечно, и напрямую. Всё равно всё локально происходит. Проблема в том, как донести сведения об изменениях в базе, которые вносит клиент, д...
b
16 июля 2019 г. 8:38
bbb116

спасибо, до smart pointer еще не дошел )
Сейчас обсуждают на форуме
17 июля 2019 г. 11:49
Михаиллл

В настройкак указан индификатор проекта и ключ. Осталось понять как использовать ключ. Попробовал вставить в этот запрос 'https://[PROJECT_ID].firebaseio/users/jack/name.json?access_to...
b
17 июля 2019 г. 9:01
bbb116

Вообщем работает только если делать setSceneRect только в конструкторе главного окна, если потом менять rect например при вставке картинки то появляются сколлы все как надо только области не р...
17 июля 2019 г. 5:54
Алексей Внуков

хочу не стандартный набор символов, а все ненужное убрать чтоб не мешало. для начала решил посмотреть как работает клава на родном примере, а он на телефоне не взлетел вот и начал разби...
17 июля 2019 г. 5:06
Михаиллл

Добрый день.Возможно вы сталкивались с облаками.Нужно из Qt создавать на облаке папки, записывать в папки файлы, читать и удалять с компьютера файлы.Возможно знаете, что лучше и проще испол...
Ищу работу?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
Присоединяйтесь к нам
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB