【问题标题】:Swift Components.Url is Returning the Wrong URLSwift Components.Url 返回错误的 URL
【发布时间】:2022-08-04 23:17:32
【问题描述】:

我实现了以下代码,我可以在其中传递资源的名称,它应该给我 URL。我正在使用 Xcode 14 Beta 3。

 static let baseUrl = \"localhost:8080\"
 static func resource(for resourceName: String) -> URL? {
            
            var components = URLComponents()
            components.scheme = \"http\"
            components.percentEncodedHost = baseUrl
            components.path = \"/\\(resourceName)\"
            return components.url
            
        }

我将资源名称传递为\'my-pets\',它应该返回http://localhost:8080/my-pets,但它一直返回http://my-pets。我不确定我在哪里犯了错误。

  • 我在 Playgrounds 中测试了你的代码并得到了http://localhost:8080/my-pets
  • 谢谢!也许与 Xcode 14 Beta 3 有关。
  • components.url 应该返回 nil,因为在您的情况下,\"host\" 在语法上是不正确的(请参阅 RFC 3986 中的 \"3.2.2 \"Host\")。对于方案 \"http\" 是一个 URI当它没有主机时是无效的。因此,URLComponents 作为 URL 返回的内容是无效的。您可以提交错误。:)

标签: swift xcode nsurlcomponents xcode14


【解决方案1】:

您将“localhost:8080”作为主机名传递。这是不正确的。主机名是“localhost”。 8080 进入port 字段。

您可能想改用这种方法:

let baseURL = URLComponents(string: "http://localhost:8080")!

func resource(for resourceName: String) -> URL? {
    var components = baseURL
    components.path = "/\(resourceName)"
    return components.url
}

如果问题真的这么简单,你也可以这样做:

let baseURL = URL(string: "http://localhost:8080")!

func resource(for resourceName: String) -> URL? {
    baseURL.appending(path: resourceName)
}

【讨论】:

  • 这是最近改变的东西吗?因为相同的代码适用于 Xcode 13 和 Xcode 14 Beta 1。但不适用于 Xcode 14 Beta 3。
  • 我会说是的。我在 Beta3 上测试了您的代码并重现了该问题。但我会说这是 Beta3 修复的先前版本中的一个错误,而不是相反。
  • 恕我直言,现在比以前更糟了。当给定一个语法不正确的主机时,URLComponents 不应该产生一个 URL,尤其是一个错误的 URL(一个带有方案“http”的 URL需要一个举办方)。 ;)
  • @CouchDeveloper 考虑到 API 的其余部分,我不知道这是否真的有意义。具有无效值的 setter 是否应该将属性(主机)设置为 nil 或使整个对象无效(想想所有属性的实现会是什么样子)?它确实有点指向 API 本身的一些尴尬,但是在抛出 setter 之前,“设置一个无效的值会消除那个特定的值”并不是一个非常不正确的方法。
  • Rob,我同意,用法似乎有点尴尬,我希望有更好的 API(可能使用 resultBuilder)。但幸运的是,我们发现了这种微妙之处,我们再次学会了小心——一如既往:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2018-11-14
相关资源
最近更新 更多