如何确保我对多个 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