2012-03-14 32 views
10

Tôi có danh sách các url, tôi cần kiểm tra xem url nào sau đây hợp lệ.Cách nhận mã phản hồi từ Yêu cầu HTTP trong Ruby

Mã Tôi đã từng là

require 'net/http' 

url = 'http://mysite.com' 
res = Net::HTTP.get_response(URI.parse(url.to_s)) 
puts res.code 

Ở đây tôi có thể kiểm tra mã phản hồi 200 cho url hợp lệ. Mối quan tâm của tôi là đối tượng 'res' được trả lại chứa mã, phần thân, vv Vì vậy, đáp ứng của tôi (đối tượng res) trở nên nặng nề. Có cách nào để tôi chỉ có thể nhận được mã phản hồi không. Tôi không cần bất kỳ thông tin nào khác. Vui lòng giúp

Trả lời

8

Tôi không kiểm tra xem có thể thực hiện với Net :: HTTP hay không, nhưng bạn có thể sử dụng Curb, đây là trình bao bọc của Ruby để cuộn tròn. Nhìn vào Curl::Easy#http_head

Với Net :: HTTP bạn cũng có thể sử dụng HTTP#head, yêu cầu tiêu đề từ máy chủ bằng phương thức HEAD.

Thông tin về phương thức HEAD HTTP:

9,4 ĐẦU phương pháp

người đứng đầu là giống với GET ngoại trừ việc máy chủ PHẢI KHÔNG trả về một thông điệp cơ thể trong phản ứng. Các metainformation chứa trong các tiêu đề HTTP để đáp ứng với một yêu cầu HEAD NÊN được giống hệt với thông tin được gửi để đáp ứng với một yêu cầu GET. Phương pháp này có thể được sử dụng để thu thập thông tin về thực thể được ngụ ý bởi yêu cầu mà không cần chuyển giao thân thực thể. Phương pháp này thường được sử dụng để kiểm tra các liên kết siêu văn bản để có hiệu lực, khả năng truy cập và sửa đổi gần đây.

Để lấy mã phản ứng của một trang:

yêu cầu
require 'net/http' 
response = nil 
Net::HTTP.start('www.example.com', 80) {|http| 
    response = http.head('/page.html') 
} 
puts response.code 
2

đầu có thể trông như thế này:

require 'socket' 

s = TCPSocket.open("google.com", 80) 
s.puts "HEAD/HTTP/1.1" 
s.puts "Host: google.com" 
s.puts 

headline = s.gets 
s.close 

status = headline.scan(/\d\d\d/).first.to_i 
5

Code tôi sử dụng là:

response = nil 
Net::HTTP.start('upload.wikimedia.org', 80) {|http| 
response = http.head(url) 
} 
puts response.code 
6

Đây là cách dễ dàng nhất trong số Faraday:

# one line to make request 
response = Faraday.head url 

# example with headers 
resource_size = response.headers['Content-Length']