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

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
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 652
Баллы
113
метод асинхронный. Вероятно, зенно вызывает его и идёт тут же дальше, не ожидая его выполнения

мб там есть синхронный ReadAsString
 

WalkODoff

Client
Регистрация
09.04.2016
Сообщения
166
Благодарностей
34
Баллы
28
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 будет давать отдельный результат без перезаписи предыдущего значения.
 

DeepFarm

Seller
Регистрация
11.05.2023
Сообщения
130
Благодарностей
34
Баллы
28
122689


WalkODoff
doc
vedi108


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

1718059778164.png
122691
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 652
Баллы
113
Посмотреть вложение 122689

WalkODoff
doc
vedi108


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

Посмотреть вложение 122690 Посмотреть вложение 122691
потому что совет не рабочий. А точнее, не рабочий он конкретно для с# экшенов
 

DeepFarm

Seller
Регистрация
11.05.2023
Сообщения
130
Благодарностей
34
Баллы
28

solo18

Client
Регистрация
02.07.2018
Сообщения
21
Благодарностей
2
Баллы
3
Ребят подскажите пожалуйста
Отправляю 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}
 

code

Administrator
Регистрация
04.06.2025
Сообщения
48
Благодарностей
7
Баллы
8
Ребят подскажите пожалуйста
Отправляю 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

solo18

Client
Регистрация
02.07.2018
Сообщения
21
Благодарностей
2
Баллы
3
Код 10002 означает, что ваша метка времени вышла за допустимые 5 секунд (recv_window) относительно серверного времени Bybit.
Синхронизируйте часы через NTP, убедитесь, что отправляете миллисекунды (Date.now()), формируйте новую timestamp для каждого запроса, подпись добавляйте с учётом recv_window.
Спасибо за ответ, я с этим разобрался.
Сейчас другая ошибка вылезла
133953


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


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


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

code

Administrator
Регистрация
04.06.2025
Сообщения
48
Благодарностей
7
Баллы
8
Спасибо за ответ, я с этим разобрался.
Сейчас другая ошибка вылезла
Посмотреть вложение 133953

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


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


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

one

Client
Регистрация
22.09.2015
Сообщения
6 920
Благодарностей
1 291
Баллы
113
"Мы будем очень рады помочь вам с вашими техническими вопросами по API. Эта ошибка указывает на то, что вашему коду не удалось правильно аутентифицировать запрос. Другими словами, X-BAPI-SIGN, сгенерированный вашим скриптом и указанный в заголовке запроса, неверен. Пожалуйста, внимательно изучите нашу документацию по API о том, как пройти аутентификацию, и после этого ознакомьтесь с примерами использования API."
Стоподуво ответ от ИИ! :D
 

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