使用C#调用Bittrex公开API获加密货币行情遇认证问题求助
解决Bittrex公开API请求的认证错误问题
首先要敲黑板:你调用的getticker是Bittrex的公开接口,完全不需要API密钥、nonce或者签名认证!你后来添加的那些认证参数和签名逻辑,不仅多余,还直接导致了认证错误——因为公开接口根本不处理这些认证信息,反而会把无效的认证请求判定为非法。
你最初的问题出在哪?
你第一次的代码只是拿到了WebResponse对象,但没有读取响应流里的实际JSON数据,而且可能缺少必要的请求头(比如User-Agent,很多平台会拦截没有UA的请求),并不是因为需要认证。
正确的公开接口请求代码
方式1:使用现代的HttpClient(推荐,更简洁易用)
using System; using System.Net.Http; using System.Windows.Forms; public partial class Form1 : Form { private const string BaseUrl = "https://bittrex.com/api/v1.1/public/getticker?market=BTC-LTC"; private async void btnGetData_Click(object sender, EventArgs e) { try { using (HttpClient client = new HttpClient()) { // 添加User-Agent,避免被平台拦截 client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"); string responseJson = await client.GetStringAsync(BaseUrl); MessageBox.Show("获取到的数据:\n" + responseJson); } } catch (Exception ex) { MessageBox.Show("请求出错:" + ex.Message); } } }
方式2:修复你最初的WebRequest代码
如果你坚持用WebRequest,需要读取响应流,并且添加必要的请求头:
using System; using System.IO; using System.Net; using System.Windows.Forms; public partial class Form1 : Form { private const string BaseUrl = "https://bittrex.com/api/v1.1/public/getticker?market=BTC-LTC"; private void btnGetData_Click(object sender, EventArgs e) { try { HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create(BaseUrl); // 添加User-Agent,避免被平台拦截 webreq.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"; using (HttpWebResponse webresp = (HttpWebResponse)webreq.GetResponse()) using (Stream stream = webresp.GetResponseStream()) using (StreamReader sr = new StreamReader(stream)) { string responseJson = sr.ReadToEnd(); MessageBox.Show("获取到的数据:\n" + responseJson); } } catch (Exception ex) { MessageBox.Show("请求出错:" + ex.Message); } } }
关于你后续错误的补充说明
你后来添加的apikey、nonce、apisign都是用于Bittrex的私有接口(比如查询个人账户资产、下单交易)的,公开接口完全不需要这些。而且你的签名逻辑也完全错误:
- HMACSHA256应该用你的API Secret作为密钥,对**完整的请求URL(包含nonce参数)**进行哈希计算
- 你反过来用URL作为密钥,用Secret作为哈希内容,这和Bittrex的要求完全相反
但再次强调:这些逻辑和公开接口无关,你完全不需要去处理它们。
内容的提问来源于stack exchange,提问作者twenty94470
相关产品推荐
相关产品推荐

