Russian Qt Forum
Ноябрь 25, 2024, 17:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QNetworkAccessManager POST запрос - не могу отправить!  (Прочитано 13810 раз)
Pripyat
Гость
« : Март 22, 2018, 12:17 »

Добрый день. Понимаю, что подобный вопрос не первый задаю, но не работает.
На планшете работает сервис на порте 7778. Ему надо послать POST запрос - JSON.


QT 5.6
Даже ответа получать не надо, на планшете будет видно, что пришел запрос.
Код:
QNetworkAccessManager *accessManager = new QNetworkAccessManager();
    accessManager->setProxy(QNetworkProxy::NoProxy);
    QNetworkRequest request;
    QString URL = "http://" + IP + ":7778";
    qDebug() << "URL " << URL;
    QUrl Url;
    Url.setUrl(IP);
    Url.setPort(7778);
    request.setUrl(Url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    QByteArray data;
    data.append("{\"cmd\" : \"enable\"}");
 
    QNetworkReply* reply = accessManager->post(request, data);
    qDebug() << reply->errorString();
    qDebug() << reply->error();

reply выдаёт
 
Цитировать
"Unknown error"
QNetworkReply::NetworkError(NoError)

Данный пример построит по примеру сотни из интернета. И там это работает. Но у меня что-то не работает.
Единственное отличие - это порт 7778, там шлют без указания портов.

Я написал тестовый сервер на Python:
Код
Python
import socket
 
sock = socket.socket()
sock.bind(('', 7778))
sock.listen(1)
conn, addr = sock.accept()
print conn, addr
while True:
   data = conn.recv(1024)
   if not data:
       break
   print data
 

Он точно принимает соединения и выводит посылки, пробовал с другими терминалами.
С данным кодом он не показывает соединения. Явно где то накосячил.

В Qt с сетью работаю в первый раз, так что прошу извинить за глупые вопросы.

Заранее спасибо большое всем за помощь.

Я даже пытаюсь уже кому нибудь отправить запрос на первый попавшийся сайт и поймать в Wireshark хоть какой нибудь обмен.
Запрос конечно не дойдет, но во всяком случае должны быть обращения к DNS, фигурирование названия сайта
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Март 22, 2018, 13:50 »

Попробуйте на ваш сокет на питоне отправить запрос через QTcpSocket
Записан

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Март 22, 2018, 13:57 »

Ну и правильно, что "reply выдает". Улыбающийся
Это его правильное состояние.
Метод post запускает выполнение запроса, выполняться он будет ассинхронно. Подпишитесь на необходимые сигналы и посмотрите как будет изменяться состояние запроса.
Записан
Pripyat
Гость
« Ответ #3 : Март 22, 2018, 14:00 »

Добрый день, спасибо за ответы.

Через сокеты отправляется:
Код:
QString IP = "192.168.0.127";
    int Port = 7778;
    QTcpSocket* client = new QTcpSocket();
    client->connectToHost(IP, Port);
    if (!client->waitForConnected(3000))
    {
        qDebug() << "No connection";
        return 1;
    }
    QByteArray Post, Json;
    Json.append("{\"command\" : \"enableProxy\"}");
    Post.append("POST / HTTP/1.1\r\n");
    Post.append(QString::sprintf("Host: %s:%d\r\n", IP, Port);
    Post.append(QString::sprintf("Content-Length: %d\r\n", Json.size()));
    Post.append(Json);
    client->write(Post);
    if (!client->waitForBytesWritten())
        if (!client->waitForConnected(3000))
        {
            qDebug() << "No send";
            return 1;
        }
    client->close();
    qDebug() << client->errorString();
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Март 22, 2018, 14:03 »

Через сокеты отправляется:
Когда вы все руками формируете... Ну если вам так удобней. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.216 секунд. Запросов: 23.