如何更改 URI 对象的路径属性?
How To change a URI object's path attribute?
我只想使用略有不同的 URI 调用 API。此代码片段可以满足我的要求,但我想知道是否有更有效的方法。
require 'net/http'
require 'json'
# These URIs differ only in the path
orders = URI('https://hft-api.lykke.com/api/Orders?orderType=Unknown')
asset_pairs = URI('https://hft-api.lykke.com/api/AssetPairs')
lykke_req = Net::HTTP::Get.new(orders)
lykke_req['User-Agent'] = 'curl/7.67.0'
lykke_req['api-key'] = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
lykke_req['Accept'] = 'application/json'
response = Net::HTTP.start(orders.hostname,
orders.port,
:use_ssl => true) {|http| http.request(lykke_req)}
puts JSON.parse(response.body)
lykke_req = Net::HTTP::Get.new(asset_pairs)
lykke_req['User-Agent'] = 'curl/7.67.0'
lykke_req['Accept'] = 'application/json'
response = Net::HTTP.start(asset_pairs.hostname,
asset_pairs.port,
:use_ssl => true) {|http| http.request(lykke_req)}
puts JSON.parse(response.body)
我所做的就是重复使用相同的代码,但 URI 略有不同。
对于我的lykke_req对象,我可以写
puts lykke_req
puts lykke_req.path
这给了我
#<Net::HTTP::Get:0x00007f947f1fdce8>
/api/Orders?orderType=Unknown
所以在我看来,我所要做的就是更改 lykke_req.path 的值。但我不知道该怎么做。我正在寻找这样的东西
lykke_req.path = "/api/AssetPairs"
失败
undefined method `path=' for #<Net::HTTP::Get GET> (NoMethodError)
我在 official documentation page 上找到了这个,但我不知道 [R] 是什么意思。是只读的意思吗?我真的必须经历创建一个新的 URI 对象,然后每次都创建一个新的 Net::HTTP::Get 对象的麻烦吗?
path [R]
这里的问题是您试图更改网络请求对象而不是 uri 对象:
irb(main):001:0> uri = URI('https://hft-api.lykke.com/api/Orders?orderType=Unknown')
=> #<URI::HTTPS https://hft-api.lykke.com/api/Orders?orderType=Unknown>
irb(main):002:0> uri.path = '/foo'
=> "/foo"
irb(main):003:0> uri.to_s
=> "https://hft-api.lykke.com/foo?orderType=Unknown"
但我真的只是将它包装在 class 中,这样您就可以封装和构建您的代码并避免重复:
class LykkeAPIClient
BASE_URI = URI('https://hft-api.lykke.com/api')
def initalize(api_key:)
@api_key = api_key
end
def get_orders
get '/Orders?orderType=Unknown'
end
def get_asset_pairs
get '/AssetPairs'
end
def get(path)
req = Net::HTTP::Get.new(BASE_URI.join(path))
req['User-Agent'] = 'curl/7.67.0'
req['Accept'] = 'application/json'
req['api-key'] = @api_key
response = Net::HTTP.start(req.hostname, req.port, use_ssl: true) do |http|
http.request(uri)
end
# @todo check response status!
JSON.parse(response.body)
end
end
@client = LykkeAPIClient.new(api_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
@orders = @client.get_orders
而不是 lykke_req.path=
做 lykke_req.uri.path=
https://ruby-doc.org/stdlib-2.6.5/libdoc/net/http/rdoc/Net/HTTPGenericRequest.html
我只想使用略有不同的 URI 调用 API。此代码片段可以满足我的要求,但我想知道是否有更有效的方法。
require 'net/http'
require 'json'
# These URIs differ only in the path
orders = URI('https://hft-api.lykke.com/api/Orders?orderType=Unknown')
asset_pairs = URI('https://hft-api.lykke.com/api/AssetPairs')
lykke_req = Net::HTTP::Get.new(orders)
lykke_req['User-Agent'] = 'curl/7.67.0'
lykke_req['api-key'] = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
lykke_req['Accept'] = 'application/json'
response = Net::HTTP.start(orders.hostname,
orders.port,
:use_ssl => true) {|http| http.request(lykke_req)}
puts JSON.parse(response.body)
lykke_req = Net::HTTP::Get.new(asset_pairs)
lykke_req['User-Agent'] = 'curl/7.67.0'
lykke_req['Accept'] = 'application/json'
response = Net::HTTP.start(asset_pairs.hostname,
asset_pairs.port,
:use_ssl => true) {|http| http.request(lykke_req)}
puts JSON.parse(response.body)
我所做的就是重复使用相同的代码,但 URI 略有不同。
对于我的lykke_req对象,我可以写
puts lykke_req
puts lykke_req.path
这给了我
#<Net::HTTP::Get:0x00007f947f1fdce8>
/api/Orders?orderType=Unknown
所以在我看来,我所要做的就是更改 lykke_req.path 的值。但我不知道该怎么做。我正在寻找这样的东西
lykke_req.path = "/api/AssetPairs"
失败
undefined method `path=' for #<Net::HTTP::Get GET> (NoMethodError)
我在 official documentation page 上找到了这个,但我不知道 [R] 是什么意思。是只读的意思吗?我真的必须经历创建一个新的 URI 对象,然后每次都创建一个新的 Net::HTTP::Get 对象的麻烦吗?
path [R]
这里的问题是您试图更改网络请求对象而不是 uri 对象:
irb(main):001:0> uri = URI('https://hft-api.lykke.com/api/Orders?orderType=Unknown')
=> #<URI::HTTPS https://hft-api.lykke.com/api/Orders?orderType=Unknown>
irb(main):002:0> uri.path = '/foo'
=> "/foo"
irb(main):003:0> uri.to_s
=> "https://hft-api.lykke.com/foo?orderType=Unknown"
但我真的只是将它包装在 class 中,这样您就可以封装和构建您的代码并避免重复:
class LykkeAPIClient
BASE_URI = URI('https://hft-api.lykke.com/api')
def initalize(api_key:)
@api_key = api_key
end
def get_orders
get '/Orders?orderType=Unknown'
end
def get_asset_pairs
get '/AssetPairs'
end
def get(path)
req = Net::HTTP::Get.new(BASE_URI.join(path))
req['User-Agent'] = 'curl/7.67.0'
req['Accept'] = 'application/json'
req['api-key'] = @api_key
response = Net::HTTP.start(req.hostname, req.port, use_ssl: true) do |http|
http.request(uri)
end
# @todo check response status!
JSON.parse(response.body)
end
end
@client = LykkeAPIClient.new(api_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
@orders = @client.get_orders
而不是 lykke_req.path=
做 lykke_req.uri.path=
https://ruby-doc.org/stdlib-2.6.5/libdoc/net/http/rdoc/Net/HTTPGenericRequest.html