Russian Qt Forum

Qt => Работа с сетью => Тема начата: ti0 от Ноябрь 10, 2015, 22:08



Название: HTTPS POST Request
Отправлено: ti0 от Ноябрь 10, 2015, 22:08
Написал класс, который отправляет post запрос на web сервис и возвращает ответ. Все работает, но только до того момента, пока не используется https. В нете ничего нету, Qt воовбще поддерживает https с ssl?


Название: Re: HTTPS POST Request
Отправлено: Aleksey_A от Ноябрь 10, 2015, 22:47
да, QNetworkRequest, QNetworkReply вполне работают с https.
Примерно так:

mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();
    void httpFinished();

private:
    Ui::MainWindow *ui;

    QNetworkAccessManager networkManager;
    QNetworkReply *reply;
};

#endif // MAINWINDOW_H

mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUrl>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
//---------------------------------------------
MainWindow::~MainWindow()
{
    delete ui;
}
//---------------------------------------------
void MainWindow::on_pushButton_clicked()
{
    QUrl url("https://www.yandex.ru");
    QNetworkRequest request;
    request.setUrl(url);

    reply = networkManager.get(request);
    reply->ignoreSslErrors();
    connect(reply, SIGNAL(finished()),this, SLOT(httpFinished()));
}
//---------------------------------------------
void MainWindow::httpFinished()
{
    if (reply->error() != QNetworkReply::NoError) {
        qDebug() << QString("error: %1 (%2)").arg(reply->error()).arg(reply->errorString());
    } else {
        QString answer = reply->readAll();
        qDebug() << answer;
    }

    reply->deleteLater();
}

По поводу игнорирования ошибок SSL можно глянуть в документации на QNetworkReply::ignoreSslErrors(const QList<QSslError> & errors)
Я в примере использовал метод get, но у QNetworkAccessManager есть и post.