Ответ HTTP запроса не передаётся корректно в переменную, но в лог выводится (общий код)

  • Автор темы Автор темы vedi108
  • Дата начала Дата начала

vedi108

Client
Регистрация
22.08.2022
Сообщения
16
Реакции
3
Баллы
3
Имеется C# кубик:
BybitApiWalletBalance.GetWalletBalanceAsync(project);

который вызывает код в Общем коде функцию:
C#:
Развернуть Свернуть Копировать
class BybitApiWalletBalance
{
    private const string BaseUrl = "https://api.bybit.com";
    private const string ApiKey = "0000000000";
    private const string ApiSecret = "111111111111111111111";
    private static readonly HttpClient client = new HttpClient();



    public static async Task GetWalletBalanceAsync(IZennoPosterProjectModel project)
    {
        string accountType = "CONTRACT";
        string coin = "USDT";

        string endpoint = "/v5/account/wallet-balance";
        string parameters = $"accountType={accountType}&api_key={ApiKey}&coin={coin}&timestamp={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}";
        string sign = CreateSignature(ApiSecret, parameters);

        string url = $"{BaseUrl}{endpoint}?{parameters}&sign={sign}";
        HttpResponseMessage response = await client.GetAsync(url);
        string content = await response.Content.ReadAsStringAsync();

        project.Variables["tmp_2"].Value = Convert.ToString(content);
        project.SendInfoToLog(content, false);

    }

    private static string CreateSignature(string secret, string message)
    {
        byte[] keyByte = Encoding.UTF8.GetBytes(secret);
        byte[] messageBytes = Encoding.UTF8.GetBytes(message);
        using (var hmacsha256 = new HMACSHA256(keyByte))
        {
            byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
            return BitConverter.ToString(hashmessage).Replace("-", "").ToLower();
        }
    }
}

Так вот,при вызове функции, его ответ без ошибок выводится в лог (строка 24), но в переменную с ПЕРВОГО РАЗА не заносится, НО при повторном вызове функции, в лог выводится ответ второго запроса , а в переменную заносится ОТВЕТ из ПЕРВОГО ЗАПРОСА.

Помогите победить эту проблему. пробовал разные варианты, например, там же распарсить JSON, но опять таки распаршивается предыдущий запрос, а не последний.


Скрин первого запроса:
2024-02-17_230630.jpg



Скрин второго запроса
2024-02-17_231050.jpg
 
метод асинхронный. Вероятно, зенно вызывает его и идёт тут же дальше, не ожидая его выполнения

мб там есть синхронный ReadAsString
 
C#:
Развернуть Свернуть Копировать
class BybitApiWalletBalance
{
    private const string BaseUrl = "https://api.bybit.com";
    private const string ApiKey = "0000000000";
    private const string ApiSecret = "111111111111111111111";
    private static readonly HttpClient client = new HttpClient();

    public static async Task<string> GetWalletBalanceAsync(IZennoPosterProjectModel project)
    {
        string accountType = "CONTRACT";
        string coin = "USDT";

        string endpoint = "/v5/account/wallet-balance";
        string parameters = $"accountType={accountType}&api_key={ApiKey}&coin={coin}&timestamp={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}";
        string sign = CreateSignature(ApiSecret, parameters);

        string url = $"{BaseUrl}{endpoint}?{parameters}&sign={sign}";
        HttpResponseMessage response = await client.GetAsync(url);
        string content = await response.Content.ReadAsStringAsync();

        // project.Variables["tmp_2"].Value = Convert.ToString(content);
        project.SendInfoToLog(content, false);

        return content;
    }

    private static string CreateSignature(string secret, string message)
    {
        byte[] keyByte = Encoding.UTF8.GetBytes(secret);
        byte[] messageBytes = Encoding.UTF8.GetBytes(message);
        using (var hmacsha256 = new HMACSHA256(keyByte))
        {
            byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
            return BitConverter.ToString(hashmessage).Replace("-", "").ToLower();
        }
    }
}


В коде я закомментировал строку project.Variables["tmp_2"].Value = Convert.ToString(content);, которая записывает значение в глобальную переменную. Вместо этого я добавил в функцию возврат значения content типом Task<string>. Теперь эту функцию можно вызвать и получить результат каждого запроса отдельно.

Например, в вызывающей стороне ты можешь получить ответ каждого запроса следующим образом:


C#:
Развернуть Свернуть Копировать
string responseContent1 = await BybitApiWalletBalance.GetWalletBalanceAsync(project);
string responseContent2 = await BybitApiWalletBalance.GetWalletBalanceAsync(project);

// ... обработка ответов для каждого запроса ...


Таким образом, каждый вызов функции GetWalletBalanceAsync будет давать отдельный результат без перезаписи предыдущего значения.
 
122689


WalkODoff
doc
vedi108


Ребят, подскажите, почему я получаю эту ошибку, все сделал, как вы тут описали. Подскажите, пожалуйста.

1718059778164.png
122691
 
Посмотреть вложение 122689

WalkODoff
doc
vedi108


Ребят, подскажите, почему я получаю эту ошибку, все сделал, как вы тут описали. Подскажите, пожалуйста.

Посмотреть вложение 122690 Посмотреть вложение 122691
потому что совет не рабочий. А точнее, не рабочий он конкретно для с# экшенов
 
Ребят подскажите пожалуйста
Отправляю POST запрос на биржу bybit
и приходит вот такой ответ, связанный с временем сервера,
не пойму , как исправить

{"retCode":10002,"retMsg":"invalid request, please check your server timestamp or recv_window param. req_timestamp[1672211928338],server_timestamp[1749618791417],recv_window[5000]","result":{},"retExtInfo":{},"time":1749618791417}
 
Ребят подскажите пожалуйста
Отправляю POST запрос на биржу bybit
и приходит вот такой ответ, связанный с временем сервера,
не пойму , как исправить

{"retCode":10002,"retMsg":"invalid request, please check your server timestamp or recv_window param. req_timestamp[1672211928338],server_timestamp[1749618791417],recv_window[5000]","result":{},"retExtInfo":{},"time":1749618791417}
Код 10002 означает, что ваша метка времени вышла за допустимые 5 секунд (recv_window) относительно серверного времени Bybit.
Синхронизируйте часы через NTP, убедитесь, что отправляете миллисекунды (Date.now()), формируйте новую timestamp для каждого запроса, подпись добавляйте с учётом recv_window.
 
  • Спасибо
Реакции: one
Код 10002 означает, что ваша метка времени вышла за допустимые 5 секунд (recv_window) относительно серверного времени Bybit.
Синхронизируйте часы через NTP, убедитесь, что отправляете миллисекунды (Date.now()), формируйте новую timestamp для каждого запроса, подпись добавляйте с учётом recv_window.
Спасибо за ответ, я с этим разобрался.
Сейчас другая ошибка вылезла
133953


Написал в саппорт байбит, вот что ответили


"Мы будем очень рады помочь вам с вашими техническими вопросами по API. Эта ошибка указывает на то, что вашему коду не удалось правильно аутентифицировать запрос. Другими словами, X-BAPI-SIGN, сгенерированный вашим скриптом и указанный в заголовке запроса, неверен. Пожалуйста, внимательно изучите нашу документацию по API о том, как пройти аутентификацию, и после этого ознакомьтесь с примерами использования API."


Вроде все сделал как в документации байбит
ключи все верные
Помогите пожалуйста отправить запрос может экшеном C# знаете рабочий код
нужно разместить ордер на бессрочный USDT со стопами и тейками
 
Спасибо за ответ, я с этим разобрался.
Сейчас другая ошибка вылезла
Посмотреть вложение 133953

Написал в саппорт байбит, вот что ответили


"Мы будем очень рады помочь вам с вашими техническими вопросами по API. Эта ошибка указывает на то, что вашему коду не удалось правильно аутентифицировать запрос. Другими словами, X-BAPI-SIGN, сгенерированный вашим скриптом и указанный в заголовке запроса, неверен. Пожалуйста, внимательно изучите нашу документацию по API о том, как пройти аутентификацию, и после этого ознакомьтесь с примерами использования API."


Вроде все сделал как в документации байбит
ключи все верные
Помогите пожалуйста отправить запрос может экшеном C# знаете рабочий код
нужно разместить ордер на бессрочный USDT со стопами и тейками
Обратитесь, пожалуйста, в раздел для поиска помощи с подобной реализацией:
Поиск и предложение услуг по созданию шаблонов
 
"Мы будем очень рады помочь вам с вашими техническими вопросами по API. Эта ошибка указывает на то, что вашему коду не удалось правильно аутентифицировать запрос. Другими словами, X-BAPI-SIGN, сгенерированный вашим скриптом и указанный в заголовке запроса, неверен. Пожалуйста, внимательно изучите нашу документацию по API о том, как пройти аутентификацию, и после этого ознакомьтесь с примерами использования API."
Стоподуво ответ от ИИ! :D
 
Спасибо за ответ, я с этим разобрался.
Сейчас другая ошибка вылезла
Посмотреть вложение 133953

Написал в саппорт байбит, вот что ответили


"Мы будем очень рады помочь вам с вашими техническими вопросами по API. Эта ошибка указывает на то, что вашему коду не удалось правильно аутентифицировать запрос. Другими словами, X-BAPI-SIGN, сгенерированный вашим скриптом и указанный в заголовке запроса, неверен. Пожалуйста, внимательно изучите нашу документацию по API о том, как пройти аутентификацию, и после этого ознакомьтесь с примерами использования API."


Вроде все сделал как в документации байбит
ключи все верные
Помогите пожалуйста отправить запрос может экшеном C# знаете рабочий код
нужно разместить ордер на бессрочный USDT со стопами и тейками


======
{-Variable.date_now_1-}{-Variable.api_key-}5000{-Variable.zapros-} = sign (для байбита)
{-Variable.date_now_1-} = время сейчас unixtime
{-Variable.api_key-} =апикей, полученный от байбит
5000 = окно
{-Variable.zapros-} = запрос который шлешь к байбиту, пример(спот): category=spot&symbol={-Variable.pair-}&side=Buy&orderType=Limit&qty={-Variable.order_volume_in_coin-}&price={-Variable.price_order_buy-}&timeInForce=PostOnly&orderFilter=Order

{-Variable.pair-} = BTCUSDT (пара только большими буквами)
{-Variable.order_volume_in_coin-} = 0.1 (количество в монете)
{-Variable.price_order_buy-} = 65 (цена покупки в usdt)


П.С Порядок переменных имеет значение.




======
снипет для создания "hash" из sing


var input = project.Variables["sign"].Value;
var secretKey = project.Variables["secretKey"].Value;
byte[] secretkeyBytes = Encoding.UTF8.GetBytes(secretKey);
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
using (var hmac = new HMACSHA256(secretkeyBytes))
{
byte[] hashValue = hmac.ComputeHash(inputBytes);
return BitConverter.ToString(hashValue).Replace("-", "").ToLower();
}



======

post запрос до байбит такой (вкладка дополнительно)

Host: api.bybit.com
X-BAPI-SIGN: {-Variable.hash-}
X-BAPI-API-KEY: {-Variable.api_key-}
X-BAPI-TIMESTAMP: {-Variable.date_now_1-}
X-BAPI-RECV-WINDOW: 5000
Content-Type: application/json


======
 
Последнее редактирование:

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)