Есть ли способ передать параметры и заголовки, используя Net::HTTP в Ruby?
Я пытаюсь создать небольшой скрипт на Ruby для взаимодействия с API Binance ( https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md).
Вот что у меня так далеко. Это все один сценарий, но я разбил его на разделы "что я думаю работает" и "что я думаю не работает" для ясности:
Я думаю, что функции include, function и param работают правильно:
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 ответ
Я не уверен, что это решение для вас, но я переписал ваш код для использования HTTParty
драгоценный камень вместо 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
Соус можно посмотреть здесь: https://stackru.com/questions/1252210/parametrized-get-request-in-ruby