给定以下方法,我如何使用 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 并执行调用。然后你会得到回应。
我的问题已得到解答,但我已经有了一个新问题,这是基于我之后遇到的一个错误。我会提出一个新问题。
我想弄清楚如何使用他们的 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 并执行调用。然后你会得到回应。
我的问题已得到解答,但我已经有了一个新问题,这是基于我之后遇到的一个错误。我会提出一个新问题。