让我们想象一下我有以下网址部分:
val url_start = "http://example.com"
val url_part_1 = "&fields[...]&" //This part of url can be in the middle of url or in the end
val url_part_2 = "&include..."
然后我尝试连接生成的URL,如下所示:
val complete_url = url_start + url_part_2 + url_part_1
在这种情况下,我得到http://example.com&include...&fields[...]&
(不要在这里考虑语法),这是URL部分之间的一个&
符号,表示连接成功,但是如果我在不同的请求中使用不同的concat序列,如下所示:
val complete_url = url_start + url_part_1 + url_part_2
我得到http://example.com&fields[...]&&include...
,在这种情况下具体为&&
。有没有办法确保连接更安全?
答案 0 :(得分:2)
为了让您的代码保持清洁,请使用数组或对象来保留您的参数并保持"?"或"&"作为urlStart或params的一部分。最后添加这些。 e.g。
var urlStart = "http://example.com"
var params=[]
params.push ('a=1')
params.push ('b=2')
params.push ('c=3', 'd=4')
url = urlStart + '?' + params.join('&')
console.log (url) // http://example.com?a=1&b=2&c=3&d=4
答案 1 :(得分:0)
首先,您应该注意在域名后面有查询参数是无效的;它应该类似于http://example.com/?include...&fields[...]
(注意/?
部分,您可以将其替换为/
以使其成为路径参数,但它不太可能是路由器网站支持这样的参数)。例如,请参阅本文:https://www.talisman.org/~erlkonig/misc/lunatech%5Ewhat-every-webdev-must-know-about-url-encoding/以了解有关哪些网址有效的详细信息。
对于简单的抽象方法,您可以使用Kotlin的joinToString()
:
val query_part = arrayOf(
"fields[...]",
"include..."
).joinToString("&")
val whole_url = "http://example.com/?" + query_part
print(whole_url) // http://example.com/?fields[...]&include...
这种方法是抽象的,因为您不仅可以将joinToString()
用于URL,还可以用于您想要的任何字符串。这也意味着如果其中一个输入字符串本身有一个&
符号,它将成为输出字符串中的两个参数。当您作为程序员知道将加入哪些字符串时,这不是问题,但如果这些字符串由用户提供,则可能会成为问题。
对于支持网址的方法,您可以使用URIBuilder
库中的Apache HttpComponents,但您需要先导入此库。