powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите отправить строку в body HTTP запроса
2 сообщений из 2, страница 1 из 1
Помогите отправить строку в body HTTP запроса
    #39829724
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Играюсь с биржей, получилось отправлять подписанные Get запросы
Вот описание API с биржи#
# POST
#
verb = 'POST'
path = '/api/v1/order'
expires = 1518064238 # 2018-02-08T04:30:38Z
data = '{"symbol":"XBTM15","price":219.0,"clOrdID":"mm_bitmex_1a/oemUeQ4CAJZgP3fjHsA","orderQty":98}'

# HEX(HMAC_SHA256(apiSecret, 'POST/api/v1/order1518064238{"symbol":"XBTM15","price":219.0,"clOrdID":"mm_bitmex_1a/oemUeQ4CAJZgP3fjHsA","orderQty":98}'))
# Result is:
# '1749cd2ccae4aa49048ae09f0b95110cee706e0944e6a14ad0b3a8cb45bd336b'
signature = HEX(HMAC_SHA256(apiSecret, verb + path + str(expires) + data))
Get не прикрепляю, там все то же самое но без data
Вот моя "реализация" Post и Get к этой бирже
Код: pascal
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.
85.
86.
function TTraderThreadMain.API_PostGetSigned(AParams: TStringList; const AMethod, AData: String; const APath: String;
  var IsExcepted: Boolean): String;
var
  Param, URLParam, URLPath, Nonce, S: String;
  PostData: TStringList;
  MS: TStringStream;

  Sign: AnsiString;
  Http_req: TIdHTTP;
  SSL_req: TIdSSLIOHandlerSocketOpenSSL;
  i, N: Integer;
begin
  Result := '';
  IsExcepted := false;
  // if AParams.Count > 0 then
  try
    Param := '';
    N := TUniTrader(ATrader).Nonce;
    PostData := TStringList.Create;
    MS := TStringStream.Create;

    Http_req := TIdHTTP.Create(nil);
    SSL_req := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    Http_req.IOHandler := SSL_req;
    Http_req.ReadTimeout := 10000;
    Http_req.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';

    if TUniTrader(ATrader).APIKind = akBitmex then
    begin
      // hex(HMAC_SHA256(apiSecret, глагол + путь + срок действия + данные))
      for i := 0 to AParams.Count - 1 do
        Param := Param + IfThen(i = 0, '', '&') + AParams.KeyNames[i] + '=' + AParams.ValueFromIndex[i];
      Nonce := IntToStr(N);

      URLPath := '/api/v1' + APath;
      URLParam := IfThen(Param = '', '', Copy(TIDURI.URLEncode('https://test.ru?' + Param), 16, 10000));
      PostData.Clear;
      if AData <> '' then
      begin
      PostData.add(AData);
      end;
      S := UpperCase(AMethod) + URLPath + URLParam + Nonce + AData; //тут вроде бы правильная строка, как по описанию api
//'POST/api/v1/position/leverage1561372499{"symbol": "XBTUSD", "leverage": 10}'
      Sign := SHA256DigestToHexW(CalcHMAC_SHA256(TUniTrader(ATrader).FAPISecret, S));
      Http_req.Request.CustomHeaders.AddValue('connection', 'Keep-Alive');
      Http_req.Request.CustomHeaders.AddValue('keep-alive', '90');
      Http_req.Request.CustomHeaders.AddValue('api-expires', Nonce);
      Http_req.Request.CustomHeaders.AddValue('api-key', TUniTrader(ATrader).FAPIID);
      Http_req.Request.CustomHeaders.AddValue('api-signature', Sign);
//      PostData.WriteBOM := False; //пробовал body передать как TStringList - тот же результат
//      PostData.TrailingLineBreak := false;
//      PostData.SaveToStream(MS);
//      MS.Position := 0;
    end;

    Http_req.AllowCookies := true;

    try
      // APIMutex.Enter;
      try
        if AMethod = 'post' then
          Result := Http_req.post(TUniTrader(ATrader).BaseURL + URLPath + URLParam, PostData); //на все post получаю 401 Unauth 
        if AMethod = 'get' then
          Result := Http_req.Get(TUniTrader(ATrader).BaseURL + URLPath + URLParam); //get запросы подписаны правильно, отрабатывают
      except
        on pe: EIdHTTPProtocolException do
        begin
          IsExcepted := true;
          Result := ' -> api error : ' + TimeToStr(Time) + ' ' + pe.Message;
        end;
        on e: exception do
        begin
          IsExcepted := true;
          Result := ' -> api error : ' + TimeToStr(Time) + ' ' + e.Message;
        end;
      end;
    finally
      // APIMutex.Leave;
    end;
  finally
    Http_req.Free;
    SSL_req.Free;
    FreeAndNil(PostData);
    FreeAndNil(MS);
  end;
end;


Явно что-то не так с отправкой body в post запросах у меня, подскажите, что не так делаю?
Спасибо!
...
Рейтинг: 0 / 0
Помогите отправить строку в body HTTP запроса
    #39829761
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понял из кода, вы хоть Get, хоть Post отправляете на один и тот же URL TUniTrader(ATrader).BaseURL + URLPath + URLParam

Код: pascal
1.
2.
3.
4.
        if AMethod = 'post' then
          Result := Http_req.post(TUniTrader(ATrader).BaseURL + URLPath + URLParam, PostData); //на все post получаю 401 Unauth 
        if AMethod = 'get' then
          Result := Http_req.Get(TUniTrader(ATrader).BaseURL + URLPath + URLParam); //get запросы подписаны правильно, отрабатывают   



но ведь в вашем случае если Post, то должен быть другой URL, как то так

Код: pascal
1.
2.
        if AMethod = 'post' then
          Result := Http_req.post(TUniTrader(ATrader).BaseURL + URLPath, PostData); //на все post получаю 401 Unauth 
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите отправить строку в body HTTP запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]