duandian8251 2017-09-14 20:12
浏览 37

用于Bitfinex API V2.0的Golang客户端:如何发布经过身份验证的请求

I'm trying to use the Bitfinex REST API V2.0 and here there is a description of how a request should be authenticated. Here below is my golang implementation:

func (c *Client) newAuthenticatedRequest(method string, refURL string, data map[string]interface{}) (*http.Request, error) {
    path := "auth/r/" + refURL
    rel, err := url.Parse(path)
    if err != nil {
        return nil, err
    }

    payload := "{}"
    if data != nil {
        p, err := json.Marshal(data)
        if err != nil {
            return nil, err
        }
        payload = string(p)
    }

    url := c.BaseURL.ResolveReference(rel)
    req, err := http.NewRequest(method, url.String(), strings.NewReader(payload))
    if err != nil {
        return nil, err
    }

    nonce := utils.GetNonce()
    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Accept", "application/json")
    req.Header.Add("bfx-nonce", nonce)
    req.Header.Add("bfx-apikey", c.APIKey)
    req.Header.Add("bfx-signature", c.signPayload("/api/v2/" + path + nonce + payload))

    return req, nil
}

func (c *Client) signPayload(payload string) string {
    sig := hmac.New(sha512.New384, []byte(c.APISecret))
    sig.Write([]byte(payload))
    return hex.EncodeToString(sig.Sum(nil))
}

func (c *Client) do(req *http.Request, v interface{}) (*Response, error) {
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return nil, err
    }

    defer resp.Body.Close()

    response, err := newResponse(resp)
    if err != nil {
       return nil, err
    }

    if v != nil {
        err = json.Unmarshal(response.Body, v)
        if err != nil {
            return nil, err
        }
    }

    return response, nil
}

func (s *WalletsService) All() ([]Wallet, error) {
    req, err := s.client.newAuthenticatedRequest("POST", "wallets", nil)
    if err != nil {
        return nil, err
    }

    var w []Wallet
    _, err = s.client.do(req, &w)
    if err != nil {
        return nil, err
    }

    return w, nil
}

The problem is that when i POST a request, I always get back error [10100] apikey: invalid. Is it correct to set the payload to {} when empty? I've tried any possible combination but no way.

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥100 为什么这个恒流源电路不能恒流?
    • ¥15 有偿求跨组件数据流路径图
    • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
    • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
    • ¥15 CSAPPattacklab
    • ¥15 一直显示正在等待HID—ISP
    • ¥15 Python turtle 画图
    • ¥15 stm32开发clion时遇到的编译问题
    • ¥15 lna设计 源简并电感型共源放大器
    • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)