有没有一种方法可以在Ruby中使用Net :: HTTP传递参数和标头?

时间:2019-01-06 11:29:51

标签: ruby http-headers uri binance

我正在尝试构建一个小的Ruby脚本来与Binance API(https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md)进行交互

这是我到目前为止所拥有的。这都是一个脚本,但是为了清楚起见,我将其分为“我认为有效的”和“我认为无效的”两部分:

我认为包含,函数和参数创建工作正常:

require 'json'
require 'uri'
require 'net/http'
require 'openssl'

def params_with_signature(params, secret)
  params = params.reject { |_k, v| v.nil? }
  query_string = URI.encode_www_form(params)
  signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), secret, query_string)
  params = params.merge(signature: signature)
end

BASE_URL = 'https://api.binance.com'
api_key = ''
api_secret = ''

params = {
    symbol: 'BNBBTC',
    side: 'BUY',
    type: 'MARKET',
    timeInForce: 'GTC',
    quantity: 1,
    recvWindow: 5000,
    timestamp: Time.now.to_i * 1000
}

我认为这是问题所在

uri = URI("#{BASE_URL}/api/v3/order")

header = {'Content-Type': 'text/json'}

http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri, header)
request.body = params_with_signature(params, api_secret).to_json
request["X-MBX-APIKEY"] = api_key

response = http.request(request)

puts response.body

问题是尝试发送请求时,我不断收到各种“格式错误”的错误。同样,我认为问题出在上面的Net :: HTTP post尝试。

任何想法都很棒!

1 个答案:

答案 0 :(得分:0)

我不确定这是否是您的解决方案,但我已经重写了您的代码以使用HTTParty gem而不是net/http。在我看来,使用该宝石要容易得多。 结果,我得到{"code":-2014,"msg":"API-key format invalid."},因为我没有Binance的API密钥,所以我认为这是一个正确的响应。

require 'json'
require 'uri'
require 'httparty'
require 'openssl'

def params_with_signature(params, secret)
  params = params.reject { |_k, v| v.nil? }
  query_string = URI.encode_www_form(params)
  signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), secret, query_string)
  params.merge(signature: signature)
end

params = {
    symbol: 'BNBBTC',
    side: 'BUY',
    type: 'MARKET',
    timeInForce: 'GTC',
    quantity: 1,
    recvWindow: 5000,
    timestamp: Time.now.to_i * 1000
}

BASE_URL = 'https://api.binance.com'
api_key = ''
api_secret = ''

uri = URI("#{BASE_URL}/api/v3/order")

headers = {
  'X-MBX-APIKEY': api_key,
  'Content-Type': 'text/json'
}

response = HTTParty.post(uri, headers: headers, body: params_with_signature(params, api_secret))

puts response.body

让我知道它是否对您有帮助:)

对于Net/Http,您可以在此处查看:https://stackoverflow.com/questions/1252210/parametrized-get-request-in-ruby

相关问题