如何安全地连接API请求URL

时间:2018-02-15 14:39:29

标签: url kotlin concatenation

让我们想象一下我有以下网址部分:

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...,在这种情况下具体为&&。有没有办法确保连接更安全

2 个答案:

答案 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,但您需要先导入此库。