【问题标题】:How can i parse code from URL in Android?如何从 Android 中的 URL 解析代码?
【发布时间】:2023-11-12 07:01:01
【问题描述】:

我有下一个 uri:

https://91c2ee0d-05ff-4611-2192-8472eabe98f1.example.org/redirect#code=d5215173-2be3-4491-bf2a-d9d039a50e97&id_token=eyJhbGciOiJQU

如何解析我的代码?

d5215173-2be3-4491-bf2a-d9d039a50e97

我试着这样做:

val uri: Uri = Uri.parse(url) 
val code: String = uri.getQueryParameter("code").toString()

但这对我不起作用。

【问题讨论】:

  • 井号后面的部分是片段标识符,所以getQueryParameter方法不起作用。您可以使用getFragment 方法获取# 之后的完整字符串,然后从中提取代码
  • # 之后的所有内容都在uri.fragment 中。我认为Uri 类不会帮助您进一步解析它,但您可以从那里手动完成。或者,您可以作弊并将 # 替换为 ?,然后将其传递给 Uri.parse(),这将导致它解析为查询字符串,然后 uri.getQueryParameter("code") 将按预期工作。

标签: android kotlin parsing uri


【解决方案1】:

现在我用下一个解决方案解决了这个问题:

val url: String = Uri.parse(url).toString()
var code = ""
if (url.contains("#code=")) {
    code = url.substring(url.indexOf("#code=") + 6)
    if (code.contains("&")) {
        code = code.split("&")[0]
    }
}

【讨论】:

    【解决方案2】:

    您也可以使用正则表达式:

    val url = Uri.parse(url).toString()
    
    val matcher = Pattern.compile("#code=.+&").matcher(url)
    val code = if (matcher.find())
        url.slice(matcher.start() + 6 until matcher.end() - 1) else ""
    

    【讨论】: