Проверьте, действительно ли URL-адрес эликсира

Я хочу проверить, действительно ли данный URL-адрес, в идеале, если URL-адрес также разрешен.

Во-первых, как я могу просто проверить правильность строки (т.е. regex)

и, во-вторых, есть ли способ, чтобы я мог видеть, действительно ли URL-адрес разрешает ресурс в Интернете?

Спасибо

Ответы

Ответ 1

Вместо того, чтобы обращаться к регулярному выражению, я бы использовал пакет URI для текстовой проверки URI, а затем проверить, разрешено ли имя узла: inet.gethostbyname:

iex(1)> URI.parse("http://google.com/")
%URI{authority: "google.com", fragment: nil, host: "google.com",
path: "/", port: 80, query: nil, scheme: "http", userinfo: nil}

Обратите внимание на поле "хост" структуры URI. Если это относительный ресурс, то это будет nil. Кроме того, схема будет равна нулю, если отсутствует схема, т.е. http:// или ftp://. Путь также должен быть там ( "/" ), даже если это только корневой путь сайта. Тогда ваша проверка заключается в том, является ли любой из них nil или нет, примерно так:

defmodule Validation do
  def validate_uri(str) do
    uri = URI.parse(str)
    case uri do
      %URI{scheme: nil} -> {:error, uri}
      %URI{host: nil} -> {:error, uri}
      %URI{path: nil} -> {:error, uri}
      uri -> {:ok, uri}
    end 
  end 
end

{:ok, uri} = Validation.validate_uri("http://google.com/")

Затем вы можете передать этот "действительный" uri в : inet.gethostbyname/1

iex(18)> :inet.gethostbyname(to_char_list a.host)
{:ok, {:hostent, 'google.com', [], :inet, 4, [{216, 58, 217, 46}]}}

Если по какой-либо причине это не удается, :inet.gethostbyname/1 вернет {:error, :nxdomain}