如何确保我对多个 HTTP 调用使用相同的会话?
How do I ensure that I am using the same session for multiple HTTP call?
假设我从循环内部调用以下代码,每次迭代之间有 1 秒 sleep/delay,URL 是 API。如何确保 Net::HTTP 对所有调用使用相同的 API 会话?我知道文档说 Net::HTTP.new 将尝试重用相同的连接。但是我如何验证呢?是否有我可以从 Net::HTTP 中提取的会话 ID?
request = Net::HTTP::Put.new(url)
url = URI(url)
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request["Accept"] = 'application/json'
request["Content-Type"] = 'application/json'
request["Authorization"] = @auth_key
request["cache-control"] = 'no-cache'
request.body = request_body.to_json if request_body
response = http.request(request)
根据您 运行 正在使用的 ruby 版本仔细检查以下内容
首先,我认为没有任何会话 ID 据我所知 这将是一个非常有用的功能。接下来查看源码,我们看到lib/net/http.rb
中的变量设置在这样的方法中:
def do_finish
@started = false
@socket.close if @socket
@socket = nil
end
# Returns true if the HTTP session has been started.
def started?
@started
end
# Finishes the HTTP session and closes the TCP connection.
# Raises IOError if the session has not been started.
def finish
raise IOError, 'HTTP session not yet started' unless started?
do_finish
end
其中 do_finish 将实例变量 @socket
设置为 nil 并且 @socket
用作 BufferedIO 实例以通过 运行 HTTP 请求
所以我会为 finish
方法编写一个覆盖方法,并在它调用 do_finish
时发出警报。
查看评论 start
最安全的选择是使用同一个会话,所以你可以使用一个开始块并比较实例变量的id不改变
Net::HTTP.start(url) do |http|
before = http.instance_variable_get(:@socket)
loop do
instance_var = http.instance_variable_get(:@socket)
break unless before == instance_var
end
end
假设我从循环内部调用以下代码,每次迭代之间有 1 秒 sleep/delay,URL 是 API。如何确保 Net::HTTP 对所有调用使用相同的 API 会话?我知道文档说 Net::HTTP.new 将尝试重用相同的连接。但是我如何验证呢?是否有我可以从 Net::HTTP 中提取的会话 ID?
request = Net::HTTP::Put.new(url)
url = URI(url)
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request["Accept"] = 'application/json'
request["Content-Type"] = 'application/json'
request["Authorization"] = @auth_key
request["cache-control"] = 'no-cache'
request.body = request_body.to_json if request_body
response = http.request(request)
根据您 运行 正在使用的 ruby 版本仔细检查以下内容
首先,我认为没有任何会话 ID 据我所知 这将是一个非常有用的功能。接下来查看源码,我们看到lib/net/http.rb
中的变量设置在这样的方法中:
def do_finish
@started = false
@socket.close if @socket
@socket = nil
end
# Returns true if the HTTP session has been started.
def started?
@started
end
# Finishes the HTTP session and closes the TCP connection.
# Raises IOError if the session has not been started.
def finish
raise IOError, 'HTTP session not yet started' unless started?
do_finish
end
其中 do_finish 将实例变量 @socket
设置为 nil 并且 @socket
用作 BufferedIO 实例以通过 运行 HTTP 请求
所以我会为 finish
方法编写一个覆盖方法,并在它调用 do_finish
时发出警报。
查看评论 start
最安全的选择是使用同一个会话,所以你可以使用一个开始块并比较实例变量的id不改变
Net::HTTP.start(url) do |http|
before = http.instance_variable_get(:@socket)
loop do
instance_var = http.instance_variable_get(:@socket)
break unless before == instance_var
end
end