在Swift中拆分URL查询

pav*_*los 1 url swift

我有以下URL查询:

encodedMessage=PD94bWwgdmVyNlPg%3D%3D&signature=kcig33sdAOAr%2FYYGf5r4HGN
Run Code Online (Sandbox Code Playgroud)

如何拆分查询以获取encodedMessage和signature值?

Ahm*_*d F 9

实现这一目标的正确方法是使用URLComponents:

一种用于解析基于RFC 3986的URL并从其组成部分构造URL的结构.

通过获取url组件主机字符串和查询Items数组,如下所示:

if let urlComponents = URLComponents(string: "http://mydummysite.com?encodedMessage=PD94bWwgdmVyNlPg%3D%3D&signature=kcig33sdAOAr%2FYYGf5r4HGN"), let host = urlComponents.host, let queryItems = urlComponents.queryItems {

    print(host) // mydummysite.com

    print(queryItems) // [encodedMessage=PD94bWwgdmVyNlPg==, signature=kcig33sdAOAr/YYGf5r4HGN]
}
Run Code Online (Sandbox Code Playgroud)

queryItems数组包含URLQuery项对象,其具有name和value属性:

if let urlComponents = URLComponents(string: "http://mydummysite.com?encodedMessage=PD94bWwgdmVyNlPg%3D%3D&signature=kcig33sdAOAr%2FYYGf5r4HGN"),let queryItems = urlComponents.queryItems {

    // for example, we will get the first item name and value:
    let name = queryItems[0].name // encodedMessage
    let value = queryItems[0].value // PD94bWwgdmVyNlPg==
}
Run Code Online (Sandbox Code Playgroud)

也:

如果您在没有完整URL的情况下获得查询,我建议通过添加虚拟主机作为查询字符串的前缀来执行一个非常简单的技巧,如下所示:

let myQuery = "encodedMessage=PD94bWwgdmVyNlPg%3D%3D&signature=kcig33sdAOAr%2FYYGf5r4HGN"
let myDummyUrlString = "http://stackoverflow.com?" + myQuery

if let urlComponents = URLComponents(string: myDummyUrlString),let queryItems = urlComponents.queryItems {
    // for example, we will get the first item name and value:
    let name = queryItems[0].name // encodedMessage
    let value = queryItems[0].value // PD94bWwgdmVyNlPg==
} else {
    print("invalid url")
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。以上将遵循 RFC 3986 并将正确处理所有边缘情况 - 如初始的 '?' 等等在一个完整的 URL。 (2认同)

Fah*_*him 5

您可以通过以下方式获取键值对:

let str = "encodedMessage=PD94bWwgdmVyNlPg%3D%3D&signature=kcig33sdAOAr%2FYYGf5r4HGN"
let arr = str.components(separatedBy:"&")
var data = [String:Any]()
for row in arr {
    let pairs = row.components(separatedBy:"=")
    data[pairs[0]] = pairs[1]
}
let message = data["encodedMessage"]
let sig = data["signature"]
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是您正在寻找的。如果不是,您能否进一步澄清一下您在寻找什么?