Для отправки 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¶m=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, но он устарел, и использовать его крайне нежелательно.
|
|
Webmoney Z163628999150, R617151845974
|