Есть ли способ передать параметры и заголовки, используя Net :: HTTP в Ruby? - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь создать небольшой скрипт на 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 выше.

Любые идеи были бы великолепны!

1 Ответ

0 голосов
/ 06 января 2019

Я не уверен, что это решение для вас, но я переписал ваш код, чтобы использовать HTTParty gem вместо net/http. На мой взгляд, использовать этот камень намного проще. В результате у меня есть {"code":-2014,"msg":"API-key format invalid."}, который я считаю правильным ответом, поскольку у меня нет ключа API для Binance.

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 соуса вы можете посмотреть здесь: /1303825/parametrizovannyi-zapros-na-poluchenie-v-ruby

...