2009-02-25 25 views
15

Cách tốt nhất để thực hiện yêu cầu HTTP GET trong Ruby với tiêu đề đã sửa đổi là gì?Cách tạo HTTP GET với các tiêu đề đã sửa đổi?

Tôi muốn nhận được một dải byte từ cuối tệp nhật ký và đã được chơi với mã sau đây, nhưng máy chủ đang trả về một câu trả lời cho biết rằng "đó là yêu cầu mà máy chủ không thể hiểu" (máy chủ là Apache).

require 'net/http' 
require 'uri' 

#with @address, @port, @path all defined elsewhere 

httpcall = Net::HTTP.new(@address, @port) 

headers = { 
    'Range' => 'bytes=1000-' 
} 

resp, data = httpcall.get2(@path, headers) 
  1. Có cách nào tốt hơn để xác định tiêu đề trong Ruby không?
  2. Có ai biết tại sao điều này không thành công đối với Apache không? Nếu tôi truy cập vào một trình duyệt để http://[address]:[port]/[path] Tôi nhận được dữ liệu tôi đang tìm kiếm mà không gặp vấn đề gì.
+1

Tìm thấy câu hỏi này trong một tìm kiếm google ... có rất nhiều cách để làm các yêu cầu HTTP với Ruby>. < – Nippysaurus

Trả lời

25

tạo ra một giải pháp mà làm việc cho tôi (làm việc rất tốt) - ví dụ này nhận được một loạt offset:

require 'uri' 
require 'net/http' 

size = 1000 #the last offset (for the range header) 
uri = URI("http://localhost:80/index.html") 
http = Net::HTTP.new(uri.host, uri.port) 
headers = { 
    'Range' => "bytes=#{size}-" 
} 
path = uri.path.empty? ? "/" : uri.path 

#test to ensure that the request will be valid - first get the head 
code = http.head(path, headers).code.to_i 
if (code >= 200 && code < 300) then 

    #the data is available... 
    http.get(uri.path, headers) do |chunk| 
     #provided the data is good, print it... 
     print chunk unless chunk =~ />416.+Range/ 
    end 
end 
6

Nếu bạn có quyền truy cập nhật ký máy chủ, hãy thử so sánh yêu cầu từ trình duyệt với trình duyệt từ Ruby và xem có yêu cầu gì không. Nếu điều này không thực tế, hãy kích hoạt Webrick như một mô hình của máy chủ tập tin. Đừng lo lắng về kết quả, chỉ cần so sánh các yêu cầu để xem những gì họ đang làm khác nhau.

Đối với phong cách Ruby, bạn có thể di chuyển các tiêu đề nội tuyến, như vậy:

httpcall = Net::HTTP.new(@address, @port) 

resp, data = httpcall.get2(@path, 'Range' => 'bytes=1000-') 

Ngoài ra, lưu ý rằng trong Ruby 1.8+, những gì bạn đang gần như chắc chắn chạy, Net::HTTP#get2 trả về một đối tượng duy nhất HTTPResponse, không một cặp resp, data.

+0

Chạy 1.8.7 - bắt tốt trên val trở lại, cảm ơn. – Demi

Các vấn đề liên quan