Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 16.08.2015
Сообщений: 31

Как создать правильный Post запрос

07.01.2018, 19:18. Показов 2576. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер форумчане, помогите составить правильный Post запрос.

Это пример и описание предоставленное сервисом к которому мне надо подключится и получить данные. Пример написан на JavaScript.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const request = require('request')
const crypto = require('crypto')
 
const apiKey = '<Your API key here>'
const apiSecret = '<Your API secret here>'
const baseUrl = 'https://api.bitfinex.com'
 
const url = '/v1/account_infos'
const nonce = Date.now().toString()
const completeURL = baseUrl + url
const body = {
  request: url,
  nonce
}
const payload = new Buffer(JSON.stringify(body))
    .toString('base64')
 
const signature = crypto
  .createHmac('sha384', apiSecret)
  .update(payload)
  .digest('hex')
 
const options = {
  url: completeURL,
  headers: {
    'X-BFX-APIKEY': apiKey,
    'X-BFX-PAYLOAD': payload,
    'X-BFX-SIGNATURE': signature
  },
  body: JSON.stringify(body)
}
 
return request.post(
  options,
  function(error, response, body) {
    console.log('response:', JSON.stringify(body, 0, 2))
  }
)
Описание сервиса:
Authentication is done using an API key and a secret. To generate this pair, go to the API Access page.

As an example of how to authenticate, we can look at the "account_infos" endpoint.
Take the example payload above.

Nonce
The nonce provided must be strictly increasing.

The authentication procedure is as follows:

The payload is the parameters object, first JSON encoded, and then encoded into Base64
payload = parameters-object -> JSON encode -> base64

The signature is the hex digest of an HMAC-SHA384 hash where the message is your payload, and the secret key is your API secret.
signature = HMAC-SHA384(payload, api-secret).digest('hex')

send (api-key, payload, signature)

These are encoded as HTTP headers named:

X-BFX-APIKEY
X-BFX-PAYLOAD
X-BFX-SIGNATURE

А вот функция которую я написал, в ней я пытаюсь отправить Post запрос по выше описанному примеру, но пока без безрезультатно, вернее результат отрицательный. Подскажите пожалуйста как все таки правильно составить Post запрос в моем случае.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
QJsonObject BitstampRestAPI::getOrdersHistoryTes(const int &limit)
{
    QString APIkey = "SVCFhoiuBQdabkncsancmclVCXhuhuhwUUTCB";
    QString SecretAPIkey = "pppqvvFCAASzmnhDnsAeInnncdbchWQQSXb";
    QByteArray key = APIkey.toUtf8();
 
    QJsonObject recordObject;
    recordObject.insert("request", QJsonValue::fromVariant("/v1/orders/hist"));
    recordObject.insert("nonce", QJsonValue::fromVariant(QString::number(QDateTime::currentMSecsSinceEpoch()).toUtf8()));
    recordObject.insert("limit", QJsonValue::fromVariant(QString::number(limit)));
    QJsonDocument doc(recordObject);
    qDebug() << doc.toJson();
    QByteArray payload = doc.toJson().toBase64();
    qDebug() << payload;
//---
    QMessageAuthenticationCode code(QCryptographicHash::Sha384);
    code.setKey(SecretAPIkey.toUtf8());
    code.addData(payload);
    QByteArray Signature = code.result().toHex();      // returns "5DD5786EF10CD0C9A03B14A063D65B0C385C0230872C5A4ADFEE9DE049BDE2CC"
    qDebug() << Signature;
 
    QByteArray postData;
    postData.append("X-BFX-APIKEY="+key);
    postData.append("&X-BFX-PAYLOAD="+payload);
    postData.append("&X-BFX-SIGNATURE="+Signature);
 
    /*QJsonObject postData;
    postData.insert("X-BFX-APIKEY", QJsonValue::fromVariant(APIkey));
    postData.insert("X-BFX-PAYLOAD", QJsonValue::fromVariant(payload));
    postData.insert("X-BFX-SIGNATURE", QJsonValue::fromVariant(Signature));
    qDebug() << postData;
    QJsonDocument data(postData);*/
 
    /*QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    QHttpPart X_BFX_APIKEY;
    QHttpPart X_BFX_PAYLOAD;
    QHttpPart X_BFX_SIGNATURE;
    X_BFX_APIKEY.setRawHeader("X-BFX-APIKEY:", key);
    X_BFX_PAYLOAD.setRawHeader("X-BFX-PAYLOAD:", payload);
    X_BFX_SIGNATURE.setRawHeader("X-BFX-SIGNATURE:", Signature);
    multiPart->append(X_BFX_APIKEY);
    multiPart->append(X_BFX_PAYLOAD);
    multiPart->append(X_BFX_SIGNATURE);*/
 
    /*QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    QHttpPart datas;
    datas.setRawHeader("Content-Type", "application/json");
    datas.setRawHeader("Accept", "application/json");
    QJsonObject postData;
    postData.insert("X-BFX-APIKEY", QJsonValue::fromVariant(APIkey));
    postData.insert("X-BFX-PAYLOAD", QJsonValue::fromVariant(payload));
    postData.insert("X-BFX-SIGNATURE", QJsonValue::fromVariant(Signature));
    QJsonDocument data(postData);
    datas.setBody(data.toJson());
    multiPart->append(datas);*/
//---
    QJsonObject objRespons;
    QString Respons = "";
    QUrl url = "https://api.bitfinex.com/v1/orders/hist";
    QNetworkRequest request(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
    //request.setRawHeader("Content-Type", "application/json");
    //request.setRawHeader("Accept", "application/json");
    QNetworkReply* reply=  managerAPI->post(request, postData);
    // реализуем ожидание конца загрузки
    QEventLoop loop;
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    // выводим содержимое
    if (reply->error() == QNetworkReply::NoError)
    {
        Respons = reply->readAll();
        qDebug()<< "Respons: " << Respons;
        objRespons = this->ObjectFromString(Respons);
        return (objRespons);
    }
    else
    {
        qDebug()<< "reply->errorString(): " << reply->errorString();
        objRespons = this->ObjectFromString(reply->errorString());
        return (objRespons);
    }
    reply->deleteLater();
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.01.2018, 19:18
Ответы с готовыми решениями:

Как отправить правильный POST запрос с помощью xNet?
Здравствуйте, столкнулся с проблемой которую решить еще не получилось, да и не встречал решений для xNet. Я использую библиотеку xNet для...

Как создать правильный запрос с HAVING ?
Доброго времени суток, уважаемые Форумчане ! Есть вот такой запрос ---------------------- SELECT .Дата_заказа_продуктов,...

Помогите создать правильный запрос в Access
Уже 2 недели мучусь над запросом. Упрощаю схему чтобы было легче понять. Есть база с тремя таблицами: 1)список рабочих(ФИО), ...

1
2 / 2 / 0
Регистрация: 16.08.2015
Сообщений: 31
08.01.2018, 20:07  [ТС]
Как всегда все оказалось легко и просто!
Вот рабочая версия:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
QJsonObject BitstampRestAPI::getOrdersHistoryTes(const int &limit)
{
    QString APIkey = "hhSSDtxcbwy5vfvbgbjaybbksaEXorMOKQOssMM";
    QString SecretAPIkey = "n5Xpeewaaqr$$bhbxjmoomncgunOTpQ7slyg0urNhy";
    
 
    QJsonObject recordObject;
    recordObject.insert("request", QJsonValue::fromVariant("/v1/orders/hist"));
    recordObject.insert("nonce", QJsonValue::fromVariant(QString::number(QDateTime::currentMSecsSinceEpoch()).toUtf8()));
    recordObject.insert("limit", QJsonValue::fromVariant(QString::number(limit)));
    QJsonDocument doc(recordObject);
    qDebug() << doc.toJson();
    QByteArray payload = doc.toJson().toBase64();
//---
    QMessageAuthenticationCode code(QCryptographicHash::Sha384);
    code.setKey(SecretAPIkey.toUtf8());
    code.addData(payload);
    QByteArray Signature = code.result().toHex();
    
 //---
    QJsonObject objRespons;
    QString Respons = "";
    QUrl url = "https://api.bitfinex.com/v1/orders/hist";
    QNetworkRequest request(url);
 
    QByteArray paramData  = "";
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
    request.setRawHeader("Accept", "application/json");
    request.setRawHeader("X-BFX-APIKEY", APIkey.toUtf8());
    request.setRawHeader("X-BFX-PAYLOAD", payload);
    request.setRawHeader("X-BFX-SIGNATURE", Signature);
    QNetworkReply* reply=  managerAPI->post(request, paramData);
    qDebug() << request.rawHeaderList();
    // реализуем ожидание конца загрузки
    QEventLoop loop;
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    // выводим содержимое
    if (reply->error() == QNetworkReply::NoError)
    {
        Respons = "{\"OrdersHistory\":";
        Respons += reply->readAll();
        Respons += "}";
        objRespons = this->ObjectFromString(Respons);
        qDebug()<< "Respons: " << objRespons.value("OrdersHistory").toArray().size();
        return (objRespons);
    }
    else
    {
        qDebug()<< "reply->errorString(): " << reply->errorString();
        objRespons = this->ObjectFromString(reply->errorString());
        return (objRespons);
    }
    reply->deleteLater();
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.01.2018, 20:07
Помогаю со студенческими работами здесь

Создать POST запрос MySQLi
Помогите пожалуйста разобраться. Немного не понимаю синтаксис post запросов имею &lt;?php $host = 'localhost'; //Хост $user =...

Создать POST запрос для SocialClub
Делаю чекер для SocialClub, отследил пост запрос (изобр. 1) и на этом я спотыкнулся, я не знаю как получить __RequestVerificationToken,...

POST запрос: Не удалось создать защищенный канал SSL/TLS
Что не так с POST запросом? Ошибка:System.Net.WebException: &quot;Запрос был прерван: Не удалось создать защищенный канал SSL/TLS.&quot; ...

Как сделать правильный запрос
Всем привет. Ребят подскажите как сделать запрос (Просмотреть отчет о сотрудниках, которые прочитали более 1 книги) имея таблицы. Не...

Как составить правильный запрос ?
Добрый день, помогите составить правильно запрос сейчас он у меня выглядит так. &quot;ВЫБРАТЬ | Общие.Заключения,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru