Список альтернатив, чтобы проверить, работает ли ссылка в ruby ​​или нет? - PullRequest
0 голосов
/ 21 января 2019

У меня есть списки ссылок, и мне нужно проверить, какие из них находятся в рабочем состоянии.У меня большое количество ссылок, вероятно, в миллионах.

Проблема в том, что ссылка может быть временно отключена или ссылка временно не работает или недоступна.В этом случае я не хочу удалять неработающие ссылки.

Я пытался использовать фарадей, но для рабочих ссылок также выдает 304, 301, а также для получения ответа требуется время.Мне нужна альтернатива, чтобы проверить, находятся ли ссылки в рабочем состоянии или нет в ruby.

response = Faraday.get 'http://www.google.com'
response.status

Нужен способ, как мне поступить?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

К сожалению, единственный способ проверить, работает ли ссылка, - сделать HTTP-запрос.Некоторые серверы могут реализовывать HEAD, поэтому при работе он не отвечает ни на какой контент.Но это не является обязательным требованием.

Одна вещь, которую вы можете сделать, это вручную сбросить соединение, как только вы получите заголовки.Это требует немного больше ручного труда по сравнению с просто обернуть всю сеть в простой метод:

Net::HTTP.start(host, ...) do |http|
  http.request_get(path) do |response|
    response.read_body do
      # headers have been received, this block receives
      # each body chunk
      break
    end
  end
end

Например

resp = Net::HTTP.start('www.google.com', use_ssl: true) { |http|
  http.request_get('/') { |resp|
    resp.read_body { break }
  }
}


resp.code

=> "200"

resp.each_header.to_a

=> [["date", "Mon, 21 Jan 2019 10:09:15 GMT"], ["expires", "-1"], ...]

resp['date'] # you can read headers in a hash-like way

=> "Mon, 21 Jan 2019 10:09:15 GMT"

resp.body

=> ""

Таким образом, тело не ждет, и вы можетепроверьте заголовки, чтобы увидеть, был ли ответ «успешным».Http-соединение прерывается, как только отправляется первый фрагмент данных.Если сервер не отправляет чанки, вам все равно придется получить все ответы.

0 голосов
/ 21 января 2019

Я бы попробовал две вещи:

1) Используйте HTTP HEAD , который работает как GET, но извлекает только заголовки, без содержимого (так что это быстрее):

response = Faraday.head 'http://www.google.com'
response.status 

2) Проверьте ссылки в потоках, чтобы сделать их параллельными.

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