Ios URLComponents.url为零
我正在尝试使用Ios URLComponents.url为零,ios,swift,nsurl,nsurlcomponents,Ios,Swift,Nsurl,Nsurlcomponents,我正在尝试使用URLComponents来组成URL,因为这似乎就是它的用途 但是,当我访问组件的url属性时,它是nil 例如 var urlComponents = URLComponents(string: "http://google.com")! urlComponents.path = "auth/login" 那我真的 print(urlComponents) 输出 scheme: http host: google.com path: auth/login - schem
URLComponents
来组成URL
,因为这似乎就是它的用途
但是,当我访问组件的url
属性时,它是nil
例如
var urlComponents = URLComponents(string: "http://google.com")!
urlComponents.path = "auth/login"
那我真的
print(urlComponents)
输出
scheme: http host: google.com path: auth/login
- scheme : "http"
- host : "google.com"
- path : "auth/login"
但是
print(urlComponents.url)
输出nil
我是不是做错了什么?如何从所有这些中获取完整格式的URL?谢谢它看起来像是
路径
参数的字符串必须以/
开头
因此,将“auth/login”
更改为“/auth/login”
即可;DR
如果您正在创建web URL(例如http://example.com/path
),包括/
,因为它使用以下模板:
{scheme}://{user}:{password}@{host}:{port}{path}?{query}#{fragment}
{scheme}:{path}?{query}%23{fragment}
如果您正在创建非web URL(例如,mailto:user@example.com
),不要包含/
,因为它使用以下模板:
{scheme}://{user}:{password}@{host}:{port}{path}?{query}#{fragment}
{scheme}:{path}?{query}%23{fragment}
为了阐明发生这种情况的原因,的实际模板如下:
{scheme}://{user}:{password}@{host}:{port}{path}?{query}#{fragment}
请注意,除了{port}
和{path}
之外,每两个组件之间都有标点(://
,:
,),{port}
和{path}
)
因此,{path}
必须以标点符号(/
)作为前缀,否则将生成无效的URL。
在您的情况下,您必须使用:
urlComponents.path = "/auth/login"
请注意,即使省略URLComponents的不常见字段,也会遇到相同的问题:
{scheme}://{host}{path}?{query}#{fragment}
请注意,在本例中,{host}
和{path}
也是相邻的,没有标点符号将两者分开
你可能想知道为什么苹果在{port}
之前没有添加标点符号。我的猜测是因为URLComponents可以用于生成规范中的任何类型的URL,而不仅仅是Web URL。例如,它可以很容易地生成http://www.example.com/foo
,但它应该同样容易地生成mailto格式的URL:user@example.com
当省略{host}
时,URLComponents通过更改{scheme}
和{path}
之间的分隔符来实现这一点:
{scheme}:{path}?{query}%23{fragment}
因此,当我们想要生成mailto链接时,我们实际上不会在路径中包含/
:
urlComponents.scheme = "mailto"
urlComponents.path = "user@example.com"
// urlComponents.url!.absoluteString == "mailto:user@example.com"
比较URLComponents的属性和URL的属性可以提供更多的洞察力(并揭示出一些不一致性):
有两点需要注意:
url.path
的后缀中没有/
url.pathComponents[0]
是url中的第一个/
要获得模板的详细列表,可以使用以下代码:
let componentsCount = Double(8)
let iterations = Int(pow(2, componentsCount))
for i in 0..<iterations {
var urlComponents = URLComponents()
var key = ""
if i & 0b10000000 > 0 { urlComponents.scheme = "scheme"; key += "s" } else { key += " " }
if i & 0b01000000 > 0 { urlComponents.user = "user"; key += "u" } else { key += " " }
if i & 0b00100000 > 0 { urlComponents.password = "password"; key += "w" } else { key += " " }
if i & 0b00010000 > 0 { urlComponents.host = "host"; key += "h" } else { key += " " }
if i & 0b00001000 > 0 { urlComponents.port = 123; key += "r" } else { key += " " }
if i & 0b00000100 > 0 { urlComponents.path = "/path"; key += "p" } else { key += " " }
if i & 0b00000010 > 0 { urlComponents.query = "query"; key += "q" } else { key += " " }
if i & 0b00000001 > 0 { urlComponents.fragment = "fragment"; key += "f" } else { key += " " }
if let url = urlComponents.url?.absoluteString {
print("[\(key)] \(url)")
} else {
print("[\(key)] ------- nil --------")
}
}
请注意,这些都不是nil
。但是,如果将urlComponents.path=“/path”
更改为urlComponents.path=“path”
,则会得到一组完全不同的模板:
[ ]
[ f] #fragment
[ q ] ?query
[ qf] ?query#fragment
[ p ] path
[ p f] path#fragment
[ pq ] path?query
[ pqf] path?query#fragment
[ r ] //:123
[ r f] //:123#fragment
[ r q ] //:123?query
[ r qf] //:123?query#fragment
[ rp ] ------- nil --------
[ rp f] ------- nil --------
[ rpq ] ------- nil --------
[ rpqf] ------- nil --------
[ h ] //host
[ h f] //host#fragment
[ h q ] //host?query
[ h qf] //host?query#fragment
[ h p ] ------- nil --------
[ h p f] ------- nil --------
[ h pq ] ------- nil --------
[ h pqf] ------- nil --------
[ hr ] //host:123
[ hr f] //host:123#fragment
[ hr q ] //host:123?query
[ hr qf] //host:123?query#fragment
[ hrp ] ------- nil --------
[ hrp f] ------- nil --------
[ hrpq ] ------- nil --------
[ hrpqf] ------- nil --------
[ w ] //:password@
[ w f] //:password@#fragment
[ w q ] //:password@?query
[ w qf] //:password@?query#fragment
[ w p ] ------- nil --------
[ w p f] ------- nil --------
[ w pq ] ------- nil --------
[ w pqf] ------- nil --------
[ w r ] //:password@:123
[ w r f] //:password@:123#fragment
[ w r q ] //:password@:123?query
[ w r qf] //:password@:123?query#fragment
[ w rp ] ------- nil --------
[ w rp f] ------- nil --------
[ w rpq ] ------- nil --------
[ w rpqf] ------- nil --------
[ wh ] //:password@host
[ wh f] //:password@host#fragment
[ wh q ] //:password@host?query
[ wh qf] //:password@host?query#fragment
[ wh p ] ------- nil --------
[ wh p f] ------- nil --------
[ wh pq ] ------- nil --------
[ wh pqf] ------- nil --------
[ whr ] //:password@host:123
[ whr f] //:password@host:123#fragment
[ whr q ] //:password@host:123?query
[ whr qf] //:password@host:123?query#fragment
[ whrp ] ------- nil --------
[ whrp f] ------- nil --------
[ whrpq ] ------- nil --------
[ whrpqf] ------- nil --------
[ u ] //user@
[ u f] //user@#fragment
[ u q ] //user@?query
[ u qf] //user@?query#fragment
[ u p ] ------- nil --------
[ u p f] ------- nil --------
[ u pq ] ------- nil --------
[ u pqf] ------- nil --------
[ u r ] //user@:123
[ u r f] //user@:123#fragment
[ u r q ] //user@:123?query
[ u r qf] //user@:123?query#fragment
[ u rp ] ------- nil --------
[ u rp f] ------- nil --------
[ u rpq ] ------- nil --------
[ u rpqf] ------- nil --------
[ u h ] //user@host
[ u h f] //user@host#fragment
[ u h q ] //user@host?query
[ u h qf] //user@host?query#fragment
[ u h p ] ------- nil --------
[ u h p f] ------- nil --------
[ u h pq ] ------- nil --------
[ u h pqf] ------- nil --------
[ u hr ] //user@host:123
[ u hr f] //user@host:123#fragment
[ u hr q ] //user@host:123?query
[ u hr qf] //user@host:123?query#fragment
[ u hrp ] ------- nil --------
[ u hrp f] ------- nil --------
[ u hrpq ] ------- nil --------
[ u hrpqf] ------- nil --------
[ uw ] //user:password@
[ uw f] //user:password@#fragment
[ uw q ] //user:password@?query
[ uw qf] //user:password@?query#fragment
[ uw p ] ------- nil --------
[ uw p f] ------- nil --------
[ uw pq ] ------- nil --------
[ uw pqf] ------- nil --------
[ uw r ] //user:password@:123
[ uw r f] //user:password@:123#fragment
[ uw r q ] //user:password@:123?query
[ uw r qf] //user:password@:123?query#fragment
[ uw rp ] ------- nil --------
[ uw rp f] ------- nil --------
[ uw rpq ] ------- nil --------
[ uw rpqf] ------- nil --------
[ uwh ] //user:password@host
[ uwh f] //user:password@host#fragment
[ uwh q ] //user:password@host?query
[ uwh qf] //user:password@host?query#fragment
[ uwh p ] ------- nil --------
[ uwh p f] ------- nil --------
[ uwh pq ] ------- nil --------
[ uwh pqf] ------- nil --------
[ uwhr ] //user:password@host:123
[ uwhr f] //user:password@host:123#fragment
[ uwhr q ] //user:password@host:123?query
[ uwhr qf] //user:password@host:123?query#fragment
[ uwhrp ] ------- nil --------
[ uwhrp f] ------- nil --------
[ uwhrpq ] ------- nil --------
[ uwhrpqf] ------- nil --------
[s ] scheme:
[s f] scheme:%23fragment
[s q ] scheme:?query
[s qf] scheme:?query%23fragment
[s p ] scheme:path
[s p f] scheme:path%23fragment
[s pq ] scheme:path?query
[s pqf] scheme:path?query%23fragment
[s r ] scheme://:123
[s r f] scheme://:123#fragment
[s r q ] scheme://:123?query
[s r qf] scheme://:123?query#fragment
[s rp ] ------- nil --------
[s rp f] ------- nil --------
[s rpq ] ------- nil --------
[s rpqf] ------- nil --------
[s h ] scheme://host
[s h f] scheme://host#fragment
[s h q ] scheme://host?query
[s h qf] scheme://host?query#fragment
[s h p ] ------- nil --------
[s h p f] ------- nil --------
[s h pq ] ------- nil --------
[s h pqf] ------- nil --------
[s hr ] scheme://host:123
[s hr f] scheme://host:123#fragment
[s hr q ] scheme://host:123?query
[s hr qf] scheme://host:123?query#fragment
[s hrp ] ------- nil --------
[s hrp f] ------- nil --------
[s hrpq ] ------- nil --------
[s hrpqf] ------- nil --------
[s w ] scheme://:password@
[s w f] scheme://:password@#fragment
[s w q ] scheme://:password@?query
[s w qf] scheme://:password@?query#fragment
[s w p ] ------- nil --------
[s w p f] ------- nil --------
[s w pq ] ------- nil --------
[s w pqf] ------- nil --------
[s w r ] scheme://:password@:123
[s w r f] scheme://:password@:123#fragment
[s w r q ] scheme://:password@:123?query
[s w r qf] scheme://:password@:123?query#fragment
[s w rp ] ------- nil --------
[s w rp f] ------- nil --------
[s w rpq ] ------- nil --------
[s w rpqf] ------- nil --------
[s wh ] scheme://:password@host
[s wh f] scheme://:password@host#fragment
[s wh q ] scheme://:password@host?query
[s wh qf] scheme://:password@host?query#fragment
[s wh p ] ------- nil --------
[s wh p f] ------- nil --------
[s wh pq ] ------- nil --------
[s wh pqf] ------- nil --------
[s whr ] scheme://:password@host:123
[s whr f] scheme://:password@host:123#fragment
[s whr q ] scheme://:password@host:123?query
[s whr qf] scheme://:password@host:123?query#fragment
[s whrp ] ------- nil --------
[s whrp f] ------- nil --------
[s whrpq ] ------- nil --------
[s whrpqf] ------- nil --------
[su ] scheme://user@
[su f] scheme://user@#fragment
[su q ] scheme://user@?query
[su qf] scheme://user@?query#fragment
[su p ] ------- nil --------
[su p f] ------- nil --------
[su pq ] ------- nil --------
[su pqf] ------- nil --------
[su r ] scheme://user@:123
[su r f] scheme://user@:123#fragment
[su r q ] scheme://user@:123?query
[su r qf] scheme://user@:123?query#fragment
[su rp ] ------- nil --------
[su rp f] ------- nil --------
[su rpq ] ------- nil --------
[su rpqf] ------- nil --------
[su h ] scheme://user@host
[su h f] scheme://user@host#fragment
[su h q ] scheme://user@host?query
[su h qf] scheme://user@host?query#fragment
[su h p ] ------- nil --------
[su h p f] ------- nil --------
[su h pq ] ------- nil --------
[su h pqf] ------- nil --------
[su hr ] scheme://user@host:123
[su hr f] scheme://user@host:123#fragment
[su hr q ] scheme://user@host:123?query
[su hr qf] scheme://user@host:123?query#fragment
[su hrp ] ------- nil --------
[su hrp f] ------- nil --------
[su hrpq ] ------- nil --------
[su hrpqf] ------- nil --------
[suw ] scheme://user:password@
[suw f] scheme://user:password@#fragment
[suw q ] scheme://user:password@?query
[suw qf] scheme://user:password@?query#fragment
[suw p ] ------- nil --------
[suw p f] ------- nil --------
[suw pq ] ------- nil --------
[suw pqf] ------- nil --------
[suw r ] scheme://user:password@:123
[suw r f] scheme://user:password@:123#fragment
[suw r q ] scheme://user:password@:123?query
[suw r qf] scheme://user:password@:123?query#fragment
[suw rp ] ------- nil --------
[suw rp f] ------- nil --------
[suw rpq ] ------- nil --------
[suw rpqf] ------- nil --------
[suwh ] scheme://user:password@host
[suwh f] scheme://user:password@host#fragment
[suwh q ] scheme://user:password@host?query
[suwh qf] scheme://user:password@host?query#fragment
[suwh p ] ------- nil --------
[suwh p f] ------- nil --------
[suwh pq ] ------- nil --------
[suwh pqf] ------- nil --------
[suwhr ] scheme://user:password@host:123
[suwhr f] scheme://user:password@host:123#fragment
[suwhr q ] scheme://user:password@host:123?query
[suwhr qf] scheme://user:password@host:123?query#fragment
[suwhrp ] ------- nil --------
[suwhrp f] ------- nil --------
[suwhrpq ] ------- nil --------
[suwhrpqf] ------- nil --------
试图使用NSURLComponents而不是URLComponents?您的变量URLComponents中缺少“”。(你代码的第一行)@UmairAfzal我在用Swift。URLComponents桥接到NSURLComponents(根据文档)。@0ndre_uu复制错误。谢谢,我现在编辑了这个问题。我想是的:D。我在文件里翻了一番之后,正要亲自来回答这个问题。(谁会想到文档会解释出哪里出了问题,哈哈!)谢谢我想知道,如果你还需要注意这些事情,那么有一个专门的类型为你构建一个URL(而不是仅仅从scheme、host等手动构建字符串)有什么意义?sheesh…@NicolasMiari它实际上非常有用,可以将查询参数、不同的方案和主机嵌入url等。。。也许在测试和生产主机之间切换……坦克,这真的帮助了我!同样的问题让我抓狂了好几个小时。路径中缺少前面的“/”。