我的问题似乎与此问题相同:Java equivalent of Pythons urllib.urlencode(HashMap based UrlEncode)却不是。因为答案不正确(或者我做错了我不知道的错误)。
我有以下Python3代码:
def create_vxttoken_data(path_uri, expiry, reuse, shared_secret):
# Combine the parameters into a URL-encoded string
message = []
message.extend([('pathURI', path_uri)])
message.extend([('expiry', expiry)])
message.extend([('reuse', reuse)])
print(message)
url_encoded_message = urlencode(message)
print(url_encoded_message)
# ... rest of the code
这是它的输出:
[('pathURI', 'http://my.domain.net/*'), ('expiry', 1553937508), ('reuse', 0)]
pathURI=http%3A%2F%2Fmy.domain.net%2F%2A&expiry=1553937508&reuse=0
我试图用Kotlin编写它。这是我的代码:
fun main(args: Array<String>) {
val queryParams = "pathURI=$PATH_URI&expiry=${expiryTime(10)}&reuse=$REUSE"
println(queryParams)
val encodedQueryParams = URLEncoder.encode(queryParams, Charsets.UTF_8.toString())
println(encodedQueryParams)
// ... rest of the code
这是它的输出:
pathURI=http://my.domain.net/*&expiry=1553938196&reuse=0
pathURI%3Dhttp%3A%2F%2Fmy.domain.net%2F*%26expiry%3D1553938196%26reuse%3D0
通过比较第二行输出,您可以看到Kotlin / Java转换了=
,而Python没有。另外,Kotlin / Java不会翻译*
,而Python却可以。我希望Kotlin / Java像Python一样生成输出。我其余的代码将基于此信息创建令牌。因此,我的身份验证失败。
注意:当我替换
时,在我的Kotlin / Java文件中val encodedQueryParams = URLEncoder.encode(queryParams, Charsets.UTF_8.toString())
By
val encodedQueryParams = "pathURI=http%3A%2F%2Fmy.domain.net%2F%2A&expiry=1553937508&reuse=0"
然后我的其余代码将生成与Python生成的令牌完全相同的令牌。因此,这表明我的URLEncoder.encode
出了问题。
答案 0 :(得分:0)
感谢@ user207421。我发现了我的错误以及应该如何解决。因此,这是等效的Kotlin代码:
fun main(args: Array<String>) {
val requestParams = HashMap<String, String>()
requestParams["pathURI"] = PATH_URI
requestParams["expiry"] = expiryTime(10)
requestParams["reuse"] = REUSE.toString()
val encodedQueryParams = requestParams.keys.stream()
.map { key -> "$key=${encodeValue(requestParams[key].orEmpty())}" }
.reduce { p1: String?, p2: String? -> "$p1&$p2" }
.map { s -> "?$s" }
.orElse("")
println(encodedQueryParams)
// ... rest of my code
}
fun encodeValue(value: String): String {
return URLEncoder.encode(value, Charsets.UTF_8.toString())
}
要旨可以找到here。