【问题标题】:Detecting a valid web address检测有效的网址
【发布时间】:2021-08-23 01:59:03
【问题描述】:

我正在尝试编写一些代码,让我既可以验证字符串实际上是到达远程服务器的有效网址,又可以安全地将其解包到 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)
    }
}

您能否就这种方法提供一些反馈,并让我知道是否可以进行任何优化?或者如果它不正确?

感谢所有 cmets。

【问题讨论】:

  • 您对有效网址的定义是什么?根据您的定义,以下网址是否有效? apple.coom
  • 远程服务器的网址。我重新措辞了这个问题:thumbs_up:

标签: ios swift urlcomponents


【解决方案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"
        }
    }
}

说明 如果字符串不是有效的 url,则使用字符串初始化 URL 将返回 nil,因此您只需 init 使用 URL 对象即可获取 url。此外,检查方案非常容易,因为URL 有一个属性scheme,我们可以检查所需的参数。

【讨论】:

  • 太棒了 - 您的答案是我从之前发布的类似但姿势不当的帖子中收到的两个最佳答案的组合。非常感谢@thecoolwinter!
  • @AdamDahan 非常高兴 :) 很高兴我能帮上忙!
  • @AdamDahan 简单得多,只需检查 URL 是否不是文件 URL isFileURL
  • @AdamDahan 我已经告诉过你应该如何处理这个问题。如果不是文件 url 则发出 url 请求并检查响应
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2019-09-21
  • 2014-10-02
  • 2021-07-30
相关资源
最近更新 更多