Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Izosin от Июнь 12, 2018, 21:40



Название: Помогите с POST запросом.
Отправлено: 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, секретный ключ также нужно брать в настройках профиля пользователя


Название: Re: Помогите с POST запросом.
Отправлено: Hellraiser от Июнь 13, 2018, 10:48
Даже не вдаваясь в специфику обмена, сразу видно, что работа с данными неверная. Цитата из букваря:
Цитировать
data must be open for reading and must remain valid until the finished() signal is emitted for this reply.
А в приведенном коде reqdata разрушается.


Название: Re: Помогите с POST запросом.
Отправлено: Izosin от Июнь 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'. Что я делаю не так, никак понять не могу.


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


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

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