하아찡

C# 바이낸스 API 사용 - 3(C# Rest API 호출) 본문

C#/바이낸스

C# 바이낸스 API 사용 - 3(C# Rest API 호출)

하아찡 2024. 10. 5. 19:31

안녕하세요.

C#에서 RestAPI를 사용하기위해서 저는 HttpClient를 사용했습니다.

바로 본론으로 들어가서 아래와 같은 코드를 사용했습니다.

public async Task<bool> ServerTime()
{
    try
    {

        var client = new HttpClient();
        var request = new HttpRequestMessage
        {
            Method = HttpMethod.Get,
            RequestUri = new Uri(URL.ServerTime),
            Headers =
            {
                { "accept", "application/json" },
            },
        };

        using (var response = await client.SendAsync(request))
        {
            response.EnsureSuccessStatusCode(); //정상적이지 못할경우 예외처리해버림
            var body = await response.Content.ReadAsStringAsync();

            // 반환된 결과를 JSON으로 변환할 수 있으면 변환
            var ServerTime = JObject.Parse(body);
            long Time = Convert.ToInt64(ServerTime["serverTime"]);

            return Time != 0;

        }
    }
    catch (Exception e)
    {
        return false;
    }

}

 

이전에 작성했던 글에서 바이낸스 서버시간을 받아오는 코드입니다.

 

 

다른 방법은 API키를 사용한 API호출입니다.

public async Task<string> Account()
{
    try
    {
        Dictionary<string, string> Parameters = new Dictionary<string, string>();
        Parameters.Add("timestamp", DateTime.UtcNow.ConvertToUnixTime().ToString());
        Parameters.Add("recvWindow", "50000");
        Parameters.Add("omitZeroBalances", "true");

        string url = BinanceURL.GetBinanceFullUrl( MyKey.SecretKey, Parameters, URL.SpotAccount);

        var client = new HttpClient();
        var request = new HttpRequestMessage
        {
            Method = HttpMethod.Get,
            RequestUri = new Uri(url),
            Headers =
            {
                { "accept", "application/json" },
                { "X-MBX-APIKEY", MyKey.APIKey },
            },
        };

        using (var response = await client.SendAsync(request))
        {

            //return test;
            response.EnsureSuccessStatusCode(); //정상적이지 못할경우 예외처리해버림
            var body = await response.Content.ReadAsStringAsync();

            // 반환된 결과를 JSON으로 변환할 수 있으면 변환
            var json = JObject.Parse(body);
            return json.ToString(); // 필요하다면 특정 데이터 추출 가능

        }
    }
    catch (Exception e)
    {
        return e.Message + " Error ";
    }

}

 

Parameters에는 해당 API를 호출할때 사용하는 파라미터값을 추가하여 값을 전달해주기위해 사용했습니다.

헤더에 발급받은 API키를 사용해서 전달해주며,  SecretKey는 GetBinanaceFullUrl 함수를 사용해서 전달해줍니다.

 

GetBinanceFullUrl 함수

public static string GetBinanceFullUrl(string secretKey, Dictionary<string, string> items, string url)
{
    StringBuilder builder = new StringBuilder();
    foreach (KeyValuePair<string, string> item in items)
    {
        builder.Append(item.Key).Append("=").Append(item.Value).Append("&");
    }
    string queryString = builder.ToString().TrimEnd('&');

    var queryHash = ToHMACSHA256(secretKey, queryString);

    return string.Format("{0}?{1}&signature={2}", url, queryString, queryHash);
}

 

 

Key

public class Key
{
    public string APIKey { get; private set; }
    public string SecretKey { get; private set; }

    public Key(string api = "", string secret = "")
    {
        APIKey = api;
        SecretKey = secret;
    }

    /// <summary>
    /// API키값 변경
    /// </summary>
    /// <param name="key">API키값</param>
    public void SetAPIKey(string key)
    {
        APIKey = key;
    }



    /// <summary>
    /// 시크릿 키값 변경
    /// </summary>
    /// <param name="key">시크릿 키값</param>
    public void SetSecretKey(string key)
    {
        SecretKey = key;
    }



}

 

 

URL은 아래와 같이 작업해뒀습니다.

public class URLs
{
    public string ServerTime { get; private set; }
    public string SpotAccount { get; private set; }
    public string SpotTrades { get; private set; }

    public URLs()
    {
        string Spot = "https://api.binance.com";
        
        SpotAccount = Spot + "/api/v3/account";
        ServerTime = Spot + "/api/v3/time";
        SpotTrades = Spot + "/api/v3/trades";
    }
}

 

반응형