使用Ruby将HTTP GET的响应主体流式传输到HTTP POST
发布时间:2020-12-16 21:06:23 所属栏目:百科 来源:网络整理
导读:我正在尝试下载一个大文件,然后使用 Ruby将该文件发布到REST端点.该文件可能非常大,即可以存储在内存中,甚至可以存储在磁盘上的临时文件中.我一直在尝试使用Net :: HTTP,但只要他们做我正在尝试做的事情,我就可以使用任何其他库(rest-client等). 这是我试过
我正在尝试下载一个大文件,然后使用
Ruby将该文件发布到REST端点.该文件可能非常大,即可以存储在内存中,甚至可以存储在磁盘上的临时文件中.我一直在尝试使用Net :: HTTP,但只要他们做我正在尝试做的事情,我就可以使用任何其他库(rest-client等).
这是我试过的: require 'net/http' source_uri = URI("https://example.org/very_large_file") source_request = Net::HTTP::Get.new(source_uri) source_http = Net::HTTP.start(source_uri.host,source_uri.port,use_ssl: source_uri.scheme == 'https') target_uri = URI("https://example2.org/rest/resource") target_request = Net::HTTP::Post.new(target_uri) target_http = Net::HTTP.start(target_uri.host,target_uri.port,use_ssl: target_uri.scheme == 'https') source_response = source_http.request(source_request) target_request.body = source_response.read_body target_request.content_type = 'multipart/form-data' target_response = target_http.request(target_request) 我想要发生的是source_response.read_body返回一个流,然后我可以以块的形式传递给target_request. 解决方法
回答我自己的问题:这是我的解决方案.请注意,为了使这项工作,我需要修补Net :: HTTP,以便我可以访问套接字,以便从响应对象手动读取块.如果你有更好的解决方案,我仍然希望看到它.
require 'net/http' require 'excon' # provide access to the actual socket class Net::HTTPResponse attr_reader :socket end source_uri = URI("https://example.org/very_large_file") target_uri = URI("https://example2.org/rest/resource") Net::HTTP.start(source_uri.host,use_ssl: source_uri.scheme == 'https') do |http| request = Net::HTTP::Get.new source_uri http.request request do |response| len = response.content_length p "reading #{len} bytes..." read_bytes = 0 chunk = '' chunker = lambda do begin if read_bytes + Excon::CHUNK_SIZE < len chunk = response.socket.read(Excon::CHUNK_SIZE).to_s read_bytes += chunk.size else chunk = response.socket.read(len - read_bytes) read_bytes += chunk.size end rescue EOFError # ignore eof end p "read #{read_bytes} bytes" chunk end Excon.ssl_verify_peer = false Excon.post(target_uri.to_s,:request_block => chunker) end end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |