Обнаружение действительного веб — адреса

#ios #swift #urlcomponents

Вопрос:

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

Из того, что собрано из различных сообщений и исходного кода Apple:

 URLComponents is a structure designed to parse URLs based on RFC 3986 and to construct URLs from their constituent parts.
 

и на основе школ w3:

 A URL is a valid URL if at least one of the following conditions holds:

The URL is a valid URI reference [RFC3986]....
 

Будет ли этого кода достаточно для обнаружения адресов, которые достигают удаленных серверов во всемирной паутине?

 import Foundation

extension String {
    
    /// Returns `nil` if a valid web address cannot be initialized from self
    
    var url: URL?  {
        guard
            let urlComponents = URLComponents(string: self),
            let scheme = urlComponents.scheme,
            isWebServerUrl(scheme: scheme),
            let url = urlComponents.url
        else {
            return nil
        }
        return url
    }
    
    /// A web address normally starts with http:// or https:// (regular http protocol or secure http protocol).
    private func isWebServerUrl(scheme: String) -> Bool {
        (scheme == WebSchemes.http.rawValue || scheme == WebSchemes.https.rawValue)
    }
}

 

Можете ли вы дать некоторые отзывы об этом подходе и сообщить мне, можно ли провести какую-либо оптимизацию? или если это неверно?

Любые и все комментарии приветствуются.

Комментарии:

1. Каково ваше определение действительного веб-адреса? Является ли следующий веб-адрес действительным в соответствии с вашим определением? яблоко.кум

2. Веб-адрес удаленного сервера. Я переформулировал вопрос :thumbs_up:

Ответ №1:

Вы могли бы пойти еще проще и сделать

 import Foundation

extension String {
    
    /// Returns `nil` if a valid web address cannot be initialized from self
    var url: URL?  {
        return URL(string: self)
    }
    
    /// A web address normally starts with http:// or https:// (regular http protocol or secure http protocol).
    var isWebURL: Bool {
        get {
            guard let url = self.url else { return false }
            return url.scheme == "http" || url.scheme == "https"
        }
    }
}
 

Объяснение
Инициализация a с URL помощью строки вернет, nil если строка не является допустимым URL-адресом, поэтому вы можете получить URL-адрес, просто init введя объект URL. Кроме того, проверка схемы очень проста, потому URL что имеет свойство scheme , которое мы можем проверить по требуемым параметрам.

Комментарии:

1. Замечательно — Ваш ответ представляет собой комбинацию двух лучших ответов, которые я получил от аналогичных, но неправильно поставленных сообщений, которые я сделал ранее. Большое спасибо @thecoolwinter!

2. @AdamDahan Полностью 🙂 рад, что смог помочь!

3. @AdamDahan намного проще просто проверить, не является ли URL-адрес файлом URL-адрес isFileURL

4. @AdamDahan Я уже говорил вам, как вы должны подойти к этому. Сделайте запрос URL-адреса, если это не URL-адрес файла, и проверьте ответ