繁体   English   中英

Kotlin 字符串 url 参数

[英]Kotlin String url params

我有一个字符串 url 像这样:

exampleUrl = www.example.com/test?item=param1=1&param2=11&param3=111&item=param1=2&param2=22&param3=222

我想从中提取使用项目作为键的键值的 Map。

我写了下面的 function

fun String.getUrlParams(): Map<String, List<String>> {
    val params = HashMap<String, List<String>>()
    val urlParts = this.split("\\?".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
    if (urlParts.size > 1) {
        val query = urlParts[1]
        for (param in query.split("item=".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) {
            System.out.println(param)
            val key = "item"
            var value = URLDecoder.decode(param, "UTF-8")
            var values: MutableList<String>? = params[key] as MutableList<String>?
            if (values == null) {
                values = ArrayList()
                params[key] = values as ArrayList<String>
            }
            values?.add(value)
        }

    }
    return params
}

但是在打印数据上,我得到了这个 -> {item=[, param1=1&param2=11&param3=111&, param1=2&param2=22&param3=222]} 它在开始时有一个空值,在第二个值的末尾有 & 符号。

正确的应该是 -> {item=[param1=1&param2=11&param3=111, param1=2&param2=22&param3=222]}

我错过了什么? 提前致谢

拆分出现在字符串开头或结尾的内容会在结果的开头或结尾处为您提供一个空字符串。

您可以filter所有空字符串,而不是dropLastWhile

您可以使用"&?item="来避免在第一个块中出现尾随&

删除不必要的toTypedArray()和特定于 Java 的代码后,您将拥有:

fun String.getUrlParams(): Map<String, List<String>> {
    val params = HashMap<String, List<String>>()
    val urlParts = split("\\?".toRegex()).filter(String::isNotEmpty)
    if (urlParts.size > 1) {
        val query = urlParts[1]
        for (param in query.split("&?item=".toRegex()).filter(String::isNotEmpty)) {
            val key = "item"
            val value = URLDecoder.decode(param, "UTF-8")
            var values: MutableList<String>? = params[key] as MutableList<String>?
            if (values == null) {
                values = ArrayList()
                params[key] = values
            }
            values.add(value)
        }
    }
    return params
}

稍微清理一下会给出:

fun String.getUrlParams(): Map<String, List<String>> {
    val urlParts = split("\\?".toRegex()).filter(String::isNotEmpty)
    if (urlParts.size < 2) {
        return emptyMap()
    }
    val query = urlParts[1]
    return listOf("item").associateWith { key ->
        query.split("&?$key=".toRegex()).filter(String::isNotEmpty)
            .map { URLDecoder.decode(it, "UTF-8") }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM