【问题标题】:How can I use a # symbol instead of ? in URLQueryItem?如何使用 # 符号代替 ?在 URLQueryItem 中?
【发布时间】:2018-01-26 00:01:11
【问题描述】:

如果我创建这样的 URL:

    guard var urlComponents = URLComponents(url: "https://example.com/something", resolvingAgainstBaseURL: false) else {
        return
    }

    let queryItems = URLQueryItem(name: "token", value: token)
    urlComponents.queryItems = [queryItems]

    guard let urlWithQueryItem = urlComponents.url else {
        return
    }

我希望最终结果类似于https://example.com/something#token=7as78f6asd678768asd768asd678

而不是默认的https://example.com/something?token=7as78f6asd678768asd768asd678

(我正在寻找比搜索和替换 ? 字符更智能的方法)

谢谢

【问题讨论】:

  • 查询项始终(根据 HTTP 和 URI 规范)由“?”分隔。 # 用于在链接中引入锚点,但即便如此,它也完全在本地处理,不是传输的 HTTP 请求的一部分。看到这个答案:stackoverflow.com/a/1637244/3203487

标签: swift nsurlcomponents


【解决方案1】:

正如其他人所指出的,URLQueryItem 对象更适用于查询字符串与锚点/片段。话虽如此,下面是一个可以帮助您完成问题的功能。

func constructURL(withURL urlBase: String, andFragmentFromQueryItem queryItem: URLQueryItem) -> URL?{

guard let url = URL(string:urlBase) else {
    return nil
}

guard var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false) else {
    return nil
}

let fragmentKey = queryItem.name
let fragmentValue = queryItem.value ?? ""

urlComponents.fragment = "\(fragmentKey)=\(fragmentValue)"

guard let urlWithFragment = urlComponents.url else {
    return nil
}

return urlWithFragment

}

let url = constructURL(withURL:"https://example.com/something", 
andFragmentFromQueryItem: URLQueryItem(name: "token", value: "tokenValue"))
let urlString = url?.absoluteString 
print("\(urlString!)")

这里是代码的工作 Swift fiddle 的链接。 http://play.swiftengine.io/code/8JKI3/2

【讨论】:

    【解决方案2】:

    正如@rmaddy 指出的那样, ? 的含义有明显的区别。和 #。 “?”引入查询参数,它们是 URL 的一部分。 '#' 引入了“片段”,它被视为 URL 的一部分。

    不过,您可以使用 URLComponents 将片段添加到 URL。只需使用 fragment 属性即可:

    urlComponents.fragment = "token=\(token)"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 2012-09-04
      • 2018-09-21
      相关资源
      最近更新 更多