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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с POST запросом.  (Прочитано 4036 раз)
Izosin
Гость
« : Июнь 12, 2018, 21:40 »

Решил создать свой торговый бот, но никак не могу победить post запросы. Get пошел на УРА, а вот на post полный стопор.

Не могу понять как правильно заполнить заголовок запроса:
Код
C++ (Qt)
   nonce = 123457;
   QString nonce_ = QString::number(nonce);
   QString st = "nonce=" + nonce_;
 
   QString key = "S-";
   QMessageAuthenticationCode code(QCryptographicHash::Sha512);
   code.setKey(key.toUtf8());
   code.addData(st.toUtf8());
   QByteArray Signature = code.result().toHex();
   ui->textBrowser->insertPlainText(Signature);
   ui->textBrowser->insertPlainText("\n");
 
   QByteArray reqdata;
 
   QNetworkRequest request;
   request.setUrl(QUrl("https://api.exmo.me/v1/user_info"));
   request.setRawHeader("Key", "K-");
   request.setRawHeader("Sign", Signature);
   qDebug() << request.rawHeaderList();
   qDebug() << Signature;
 
   QNetworkAccessManager *manager2 = new QNetworkAccessManager(this);
   connect(manager2, SIGNAL(finished(QNetworkReply*)), this, SLOT(on_load(QNetworkReply*)));
   manager2->post(request,reqdata);
 

Выдает ошибку: 40007: Incorrect format parameter 'nonce'

Есть рабочий пример написанный на Python, немного видоизменил его что бы он посылал только один запрос, с теми же параметрами что и у меня. Параметр Sign совпадает до последнего символа. Python выдает корректный ответ. Никак не могу понять в чем моя ошибка.

Требования сайта звучат следующим образом:

Цитировать
Authenticated API

Для доступа к данному API требуется авторизация и необходимо использовать POST метод.

URL — необходимо использовать следующий адрес https://api.exmo.com/v1/{api_name} где api_name - это наименование API метода

Авторизация осуществляется с помощью отправки на сервер следующих заголовков:

Key — Публичный ключ, его нужно взять настройках профиля пользователя
(пример: K-7cc97c89aed2a2fd9ed7792d48d63f65800c447b)

Sign — POST данные (param=val&param1=val1), подписанные секретным ключом методом HMAC-SHA512, секретный ключ также нужно брать в настройках профиля пользователя
« Последнее редактирование: Июнь 13, 2018, 10:53 от Izosin » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #1 : Июнь 13, 2018, 10:48 »

Даже не вдаваясь в специфику обмена, сразу видно, что работа с данными неверная. Цитата из букваря:
Цитировать
data must be open for reading and must remain valid until the finished() signal is emitted for this reply.
А в приведенном коде reqdata разрушается.
Записан
Izosin
Гость
« Ответ #2 : Июнь 14, 2018, 14:30 »

Даже не вдаваясь в специфику обмена, сразу видно, что работа с данными неверная. Цитата из букваря:
Цитировать
data must be open for reading and must remain valid until the finished() signal is emitted for this reply.
А в приведенном коде reqdata разрушается.
Что бы я не писал в эту переменную результат выполнения запроса оставался неизменным. Получается для моих задач она не нужна. Но почему то я так и не нашел возможности обойтись без нее. Поэтому она у меня пустая и само разрушаемая.

Если что то изменить в заголовке, то меняется ошибка. А вот изменение в переменной Signature, в которую шифруются специальным ключем данные посылаемые на сервер, приводят к этой ошибке. С начало я думал что не правильно шифруются данные. Но проверив в Питоне понял что питон выдает тот же результат. Только сервер на данные питона выдает результат запроса, а на теже данные из моей программы выдает ошибку формата 'nonce'. Что я делаю не так, никак понять не могу.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #3 : Июнь 14, 2018, 14:46 »

Тогда WireShark в помощь: отправляем запросы из своей программы и из питоновской. Смотрим разницу, думаем.
P.S. Да, есть перегруженная версия post с константной ссылкой в качестве параметра. Посмотрел исходник - создается QBuffer, копируется информация, reply отвечает за удаление буфера.
« Последнее редактирование: Июнь 14, 2018, 14:57 от Hellraiser » Записан
Izosin
Гость
« Ответ #4 : Июль 09, 2018, 12:26 »

Тогда WireShark в помощь: отправляем запросы из своей программы и из питоновской. Смотрим разницу, думаем.
P.S. Да, есть перегруженная версия post с константной ссылкой в качестве параметра. Посмотрел исходник - создается QBuffer, копируется информация, reply отвечает за удаление буфера.

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


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