Как я могу обрабатывать 503 ошибки с open-uri?
Если веб-сайт возвращает ошибку "503 служба недоступна", то open-uri выдает исключение. Например:
require 'open-uri'
open('http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Dhello%26oq%3Dhello%26ie%3DUTF-8')
# OpenURI::HTTPError: 503 Service Unavailable
# ...
однако, если вы затем посетите его в веб-браузере, он фактически отображает страницу с капчей, а не ошибку.
Как я могу убедиться, что open-uri не просто выдает это как исключение, но фактически обрабатывает ответ и предоставляет мне содержимое страницы?
1 ответов
OpenURI::HTTPError
есть вы можете проверить, чтобы получить то, что вы хотите. io
- это StringIO
объект с несколькими одноэлементными методами, определенными на нем (status
например):
require 'open-uri'
begin
open('http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Dhello%26oq%3Dhello%26ie%3DUTF-8')
rescue OpenURI::HTTPError => error
response = error.io
response.status
# => ["503", "Service Unavailable"]
response.string
# => <!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html DIR=\"LTR\">\n<head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"><meta name=\"viewport\" content=\"initial-scale=1\">...
end
однако для этой задачи Net::HTTP
модуль, вероятно, лучшая альтернатива:
require 'net/http'
response = Net::HTTP.get_response(URI.parse('http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Dhello%26oq%3Dhello%26ie%3DUTF-8'))
response.code
# => "503"
response.body
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html DIR=\"LTR\">\n<head><meta http-equiv=\"content-type\" content=\"text/html; ...