首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有F#的Kraken私有API返回EGeneral:无效参数

带有F#的Kraken私有API返回EGeneral:无效参数
EN

Stack Overflow用户
提问于 2016-04-17 16:48:17
回答 1查看 2.7K关注 0票数 3

我正在尝试使用F#访问Kraken私有API。访问公共API的代码运行得非常好,但是当我试图访问私有API时,我总是会得到错误“EGeneral:无效参数”。

代码语言:javascript
复制
#r "FSharp.Data.dll"

open FSharp.Data
open System
open System.Text
open System.Security.Cryptography

let baseUri = "https://api.kraken.com"
let key = MY_KRAKEN_API_KEY
let secret = MY_KRAKEN_API_SECRET
let path = "/0/private/Balance"
let nonce = DateTime.UtcNow.Ticks
let bodyText = "nonce=" + nonce.ToString()

let hmac (key : byte []) (data : byte[]) =
    use hmac = new HMACSHA512(key)
    hmac.ComputeHash(data)

let sha256 (data : string) =
    use sha = SHA256Managed.Create()
    sha.ComputeHash(Encoding.UTF8.GetBytes(data))

let createSignature (nonce : int64) body (path : string) secret =
    let shaSum = nonce.ToString() + body |> sha256
    let data = Array.append (Encoding.UTF8.GetBytes path) shaSum
    let key = Convert.FromBase64String secret
    hmac key data |> Convert.ToBase64String

let signature = createSignature nonce bodyText path secret

let response = Http.RequestString (
    url = baseUri + path,
    httpMethod = "POST",
    headers = ([("API-Key", key); ("API-Sign", signature)] |> Seq.ofList),
    body = TextRequest bodyText
)

有人看到我做错什么了吗?

编辑: Kraken.com API文档可以在这里获得:https://www.kraken.com/help/api

我想头签名是不正确的。docu要求在标头中提交以下两个值:

API-Key = API key API -符号=使用HMAC 512 of (URI path + SHA256(nonce + POST data))和base64解码的秘密API密钥的消息签名。

编辑2:其余的参数需要用POST方法传输。在我的例子中,这只是HTTP请求主体部分中的"nonce“值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-25 20:30:25

在为Kraken编写C#库时,我也犯了同样的错误,并找到了解决这个问题的方法:

如果API键或符号错误或丢失,则不会出现此错误。问题是您没有向请求中添加mediatype。我不知道它在F#中是如何工作的,但请看下面的示例:

代码语言:javascript
复制
using (var client = new HttpClient())
{
    string address = String.Format("{0}/{1}/public/{2}", _url, _version, method);
    // Does not work with this:
    // var content = new StringContent(postData, Encoding.UTF8);
    var content = new StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded");

    var response = await client.PostAsync(address, content);

    return await response.Content.ReadAsStringAsync();
}

"application/x-www-form-urlencoded"是关键的路径。如果没有发送请求,则会得到"EGeneral:无效参数“-error。有了它,一切都很好。至少在我的情况下。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36679353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档