Net :: HTTPResponse body как IO - PullRequest
       16

Net :: HTTPResponse body как IO

1 голос
/ 17 марта 2010

Net :: HTTPResponse - это объект, похожий на поток, и вы можете прочитать его ввод в ленивых фрагментах, используя read_body В остальном ruby ​​пары представлены как класс IO. Существует ли оболочка или что-то, что позволяет мне использовать Net :: HTTPResponse, как если бы это был объект ввода-вывода?

Ответы [ 2 ]

3 голосов
/ 26 марта 2010

Используйте библиотеку OpenURI, которая поставляется со стандартным Ruby. Он использует Net :: Http под капотом и предоставляет удобный File-like объект.

require 'open-uri'
open('http://example.com/some_file') do |f|
  f.each_line do |line|
    puts "http line: #{line}"
  end
do
0 голосов
/ 26 августа 2016

Если вы в порядке с использованием потоков (возможно, безопасным только в МРТ), я использовал это с некоторым успехом:

# create an writable IO to write the response to 
# and a readable IO to return / yield to the caller
read_io, write_io = IO.pipe

write_io.binmode
read_io.binmode

# in a separate thread, continue adding chunks to the writable IO,
# which is connected to the readable IO we return
Thread.new do
  begin
    # pipe chunks to the write stream
    # response is the Net::HTTPSuccess object
    response.read_body { |chunk| write_io << chunk }
  ensure
    write_io.close
    Thread.current.exit
  end
end

# yield a readable stream while the thread feeds the writable
yield read_io

Мы создаем IO чтения и IO записи, которые связаны с IO.pipe. Поскольку read_body является блокирующей операцией, которая будет уступать блоку, который мы передаем ему, пока не будет выполнено все тело (весь контент в памяти), нам нужно read_body в отдельном потоке. Когда куски получены, они пересылаются на наш write_io. write_io по сути является прокси, но мы можем читать из read_io лениво, не дожидаясь загрузки всего тела ответа. Это полезно для потоковых парсеров и, возможно, для вашего варианта использования. CSV принимает IO и может быть лениво проанализирован с помощью этого метода следующим образом:

CSV.new(io).to_enum

Что даст вам ленивое перечисление строк CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...