给定以下方法,我如何使用 RestSharp 将请求发送到 Bitstamp API?

How do I, given the following methods, send the request to the Bitstamp API using RestSharp?

我想弄清楚如何使用他们的 API 从 Bitstamp 成功检索我的比特币余额。我花了一整天的时间在 Stack Overflow 和 youtube 上尝试解决这个问题,因为有很多小部件可以组合在一起。我认为我非常接近成功,但有一小部分我似乎无法弄清楚。

我该如何准确地执行这个请求?我可能应该在某处添加 API 身份验证,然后使用 HMACSHA256 方法对其进行签名。但顺序是什么?我该怎么做? 这是 API 文档 -> https://www.bitstamp.net/api/

这是我到目前为止的全部代码:

using RestSharp;
using System;
using System.Security.Cryptography;
using System.Text;

namespace ConsoleApp5
{
    class Program
    {
        private readonly String _clientId = "xxx";
        private readonly String _apiKey = "xxx";
        private readonly String _apiSecret = "xxx";

        static void Main(string[] args)
        {
            Console.ReadLine();
        }

        public void AddApiAuthentication(RestRequest restRequest)
        {
            var nonce = DateTime.Now.Ticks;
            var signature = GetSignature(nonce, _apiKey, _apiSecret, _clientId);

            restRequest.AddParameter("key", _apiKey);
            restRequest.AddParameter("signature", signature);
            restRequest.AddParameter("nonce", nonce);

        }

        private string GetSignature(long nonce, string key, string secret, string clientId)
        {
            string msg = string.Format("{0}{1}{2}", nonce,
                clientId,
                key);

            return ByteArrayToString(SignHMACSHA256(secret, StringToByteArray(msg))).ToUpper();
        }
        public static byte[] SignHMACSHA256(String key, byte[] data)
        {
            HMACSHA256 hashMaker = new HMACSHA256(Encoding.ASCII.GetBytes(key));
            return hashMaker.ComputeHash(data);
        }

        public static byte[] StringToByteArray(string str)
        {
            return System.Text.Encoding.ASCII.GetBytes(str);
        }

        public static string ByteArrayToString(byte[] hash)
        {
            return BitConverter.ToString(hash).Replace("-", "").ToLower();
        }
    }
}

这真的只是我缺少的执行部分。根据 API 文档,我应该涵盖所有其他内容。有些想法会很棒。

提前致谢, Nexigen.

编辑::

我做了更多的工作,现在我知道如何执行它了

using RestSharp;
using System;
using System.Security.Cryptography;
using System.Text;

namespace ConsoleApp5
{
    class Program
    {
        private readonly String _clientId = "xxx";
        private readonly String _apiKey = "xxx";
        private readonly String _apiSecret = "xxx";

        static void Main(string[] args)
        {
            Program program = new Program();

            var _request = new RestRequest();
            _request.Resource = "api/v2/balance";

            program.AddApiAuthentication(_request);

            Console.ReadLine();
        }

        public void AddApiAuthentication(RestRequest restRequest)
        {
            var nonce = DateTime.Now.Ticks;
            var signature = GetSignature(nonce, _apiKey, _apiSecret, _clientId);

            restRequest.AddParameter("X-Auth", _apiKey);
            restRequest.AddParameter("X-Auth-Signature", signature);
            restRequest.AddParameter("X-Auth-Nonce", nonce);

            var client = new RestClient();
            client.BaseUrl = new Uri("http://www.bitstamp.net/");

            IRestResponse response = client.Execute(restRequest);
            Console.WriteLine(response.Content);
        }

        private string GetSignature(long nonce, string key, string secret, string clientId)
        {
            string msg = string.Format("{0}{1}{2}", nonce,
                clientId,
                key);

            return ByteArrayToString(SignHMACSHA256(secret, StringToByteArray(msg))).ToUpper();
        }
        public static byte[] SignHMACSHA256(String key, byte[] data)
        {
            HMACSHA256 hashMaker = new HMACSHA256(Encoding.ASCII.GetBytes(key));
            return hashMaker.ComputeHash(data);
        }

        public static byte[] StringToByteArray(string str)
        {
            return System.Text.Encoding.ASCII.GetBytes(str);
        }

        public static string ByteArrayToString(byte[] hash)
        {
            return BitConverter.ToString(hash).Replace("-", "").ToLower();
        }
    }
}

但是,当我现在尝试向 http://www.bitstamp.net/api/balance, It's telling me that it's missing my api key, signature and nonce parameters. And when I use http://www.bitstamp.net/api/v2/balance 发出请求时,它告诉我它只是一个 POST 端点。我现在缺少什么?

这里有几个问题:

  • 您需要创建一个 RestClient 和一个 RestRequest 并在填充其 headers
  • 后将请求传递给客户端
  • 您使用的 header 名称与 bitstamp api 文档和示例中引用的名称不匹配:

我自己几乎是通过使用以下代码发现的:


        static void Main()
        {
            Program program = new Program();

            RestRequest request = new RestRequest("/api/v2/balance/", Method.POST);

            program.AddApiAuthentication(request);

            Console.ReadLine();
        }

        public void AddApiAuthentication(RestRequest restRequest)
        {
            var nonce = DateTime.Now.Ticks;
            var signature = GetSignature(nonce, _apiKey, _apiSecret, _clientId);
            long time = DateTime.UtcNow.Ticks / TimeSpan.TicksPerMillisecond;
            string version = "v2";
            string contentType = "application/x-www-form-urlencoded";

            restRequest.AddParameter("X-Auth", _apiKey);
            restRequest.AddParameter("X-Auth-Signature", signature);
            restRequest.AddParameter("X-Auth-Nonce", nonce);
            restRequest.AddParameter("X-Auth-Timestamp", time);
            restRequest.AddParameter("X-Auth-Version", version);
            restRequest.AddParameter("Content-Type", contentType);


            RestClient client = new RestClient
            {
                BaseUrl = new Uri("https://www.bitstamp.net/")
            };

            IRestResponse response = client.Execute(restRequest);
            Console.WriteLine(response.Content);
        }

您首先创建一个新的 RestRequest 并为其提供 POST 方法,然后(在我的例子中)您启动 AddApiAuthentication 并将您刚刚发出的请求作为参数提供给它。 然后在 AddApiAuthentication 中创建一个新的 RestClient,给它一个 URI 并执行调用。然后你会得到回应。

我的问题已得到解答,但我已经有了一个新问题,这是基于我之后遇到的一个错误。我会提出一个新问题。