Работа с HTTP в Qt

Категория: Qt Комментариев: 0

Для отправки HTTP-запросов в Qt используется класс QNetworkAccessManager. В качестве входных параметров ему передается класс QUrl, а на выходе отдается класс QNetworkReply.

Процесс отправки запроса проходит в три этапа: Инициализация QNetworkAccessManager, отправка запроса, прием ответа.
1. Создаем новый QNetworkAccessManager и начинаем ожидать от него сигнала finished:

 nam = new QNetworkAccessManager(this);
 QObject::connect(nam, SIGNAL(finished(QNetworkReply*)),
 this, SLOT(finishedSlot(QNetworkReply*)));

2. Формируем запрос в класс QUrl и и передаем его в метод get:

 QUrl url("http://localhost");
 QNetworkReply* reply = nam->get(QNetworkRequest(url));

Для отправки запроса методом POST используем метод post:

nam->post(url, QByteArray("action=do_smth&param=value"));

3. В слоте finishedSlot принимаем ответ от сервера и обрабатываем его:

void HttpRequest::finishedSlot(QNetworkReply* reply)
{
 // Не произошло-ли ошибки?
 if (reply->error() == QNetworkReply::NoError)
 {
 // Читаем ответ от сервера
 QByteArray bytes = reply->readAll();
 QString string(bytes);
 // Выводим ответ на экран
 qDebug() << string;
 }
 // Произошла какая-то ошибка
 else
 {
 // обрабатываем ошибку
 qDebug() << reply->errorString();
 }
 delete reply;
}

Вот пример отправки файла на сервер с помощью POST-запроса:

QByteArray data;
QFile file("file.ext");
if (!file.open(QIODevice::Read))
 return;
QDataStream in(&file);
in >> data ;

QString boundary;
QByteArray dataToSend;

boundary="-----------------------------7d935033608e2";

QString body = "\r\n--" + boundary + "\r\n";
body += "Content-Disposition: form-data; name=\"database\"; filename=\"file.ext\"\r\n";
body += "Content-Type: application/octet-stream\r\n\r\n";
body += data;
body += "\r\n--" + boundary + "--\r\n";
dataToSend = body.toAscii();
QNetworkRequest request(QUrl("http://www.mydomain.com/upload.aspx"));
request.setRawHeader("Content-Type","multipart/form-data; boundary=-----------------------------7d935033608e2");
request.setHeader(QNetworkRequest::ContentLengthHeader,dataToSend.size());
networkAccessManager->post(request,dataToSend);

Скачать пример

Помимо этого для отправки GET и POST запросов есть класс QHttp, но он устарел, и использовать его крайне нежелательно.

Автор: Кто-то   @   20 января 2012 Комментариев: 0
Метки :

Поблагодарить автора

Webmoney Z163628999150, R617151845974

Комментариев: 0

Комментариев к этой записи поке нет. Ваш комментарий будет первым.
оставить комментарий

Предыдущая запись
«
Следующая запись
»