如何在Kotlin中解析或拆分URL地址?

4nkexdtk  于 2022-11-16  发布在  Kotlin
关注(0)|答案(2)|浏览(239)

如果我有这个网址
https://googledroids.com/post.html?limit=25&since=1374196005&md5=d8959d12ab687ed5db978cb078f1e&time=0dfdbac117
如何获取(或拆分)参数(避免硬编码)?
我需要分隔值:

  • https协议
  • googledroids.com
  • /post.html
  • 参数和值:{limit=25, time=0dfdbac117, since=1374196005, md5=d8959d12ab687ed5db978cb078f1e}
hvvq6cgz

hvvq6cgz1#

下面的代码应该可以工作,它给出了一个参数值列表,而不是一个。

val uri = Uri.parse("https://googledroids.com/post.html?limit=25&since=1374196005&md5=d8959d12ab687ed5db978cb078f1e&time=0dfdbac117")
val host = uri.host // googledroids.com
val protocol = uri.scheme // https
val path = uri.path // /post.html
val parameters = uri.queryParameterNames.associateWith { uri.getQueryParameters(it) } // {limit:[25], time:[0dfdbac117], since:[1374196005], md5:[d8959d12ab687ed5db978cb078f1e]}
v1uwarro

v1uwarro2#

使用类别:

import android.net.Uri

我们可以使用值protocol、server、path、parameters,并且可以选择使用uri.getQueryParameter()获取特定的参数值:

val url = "https://googledroids.com/post.html?limit=25&since=1374196005&md5=d8959d12ab687ed5db978cb078f1e&time=0dfdbac117"
    val uri = Uri.parse(url) 
    val protocol = uri.scheme  // https
    val server = uri.authority  // googledroids.com
    val path = uri.path  // /post.html
    val args = uri.queryParameterNames //size: 4 parameters
    val limit = uri.getQueryParameter("limit") // limit: "25"
    println("value of limit: $limit")

我们也可以获得参数列表(使用this question´s answer(java)):

val url = "https://googledroids.com/post.html?limit=25&since=1374196005&md5=d8959d12ab687ed5db978cb078f1e&time=0dfdbac117"
    val uri = Uri.parse(url) 
    val protocol = uri.scheme  // https
    val server = uri.authority  // googledroids.com
    val path = uri.path  // /post.html
    val args = uri.queryParameterNames //size: 4 parameters

    val query = uri.query
    val data: MutableMap<String, String> = HashMap()
    for (param in query?.split("&")?.toTypedArray()!!) {
        val params = param.split("=").toTypedArray()
        val paramName = URLDecoder.decode(params[0], UTF_8)
        var value = ""
        if (params.size == 2) {
            value = URLDecoder.decode(params[1], UTF_8)
        }
        data[paramName] = value
    }
    println("$data")  //{limit=25, time=0dfdbac117, since=1374196005, md5=d8959d12ab687ed5db978cb078f1e}

这是使用uri.queryParameterNames获得参数和值的更好且简单的方法:

val uri = Uri.parse(url)
    val protocol = uri.scheme
    val server = uri.authority
    val path = uri.path
    val args = uri.queryParameterNames
    val limit = uri.getQueryParameter("limit")

    val query = uri.query

    for (paramName in uri.queryParameterNames) {
        println("parameter => $paramName | value: ${uri.getQueryParameter(paramName)}")
    }

}

相关问题