给 Uri, Kotlin 添加特殊字符

Add special characters to Uri, Kotlin

所以,我有我的基础URL,就是这样:

val GITHUB_BASE_URL: String = "https://api.github.com/search/repositories"

然后我有这段代码将参数 q (REPO_NAME_PARAM == query) 附加到 Uri 并构建它:

val builtUri: Uri = Uri.parse(GITHUB_BASE_URL).buildUpon()
               .appendQueryParameter(REPO_NAME_PARAM, repoName)
               .build()

到这里为止,一切正常。但是,当我尝试通过存储库的编写语言(例如,URL 应该是 https://api.github.com/search/repositories?q=hello+language:Kotlin)过滤存储库的搜索时,+: 个字符被 %2B%3A 取代。这会导致应用无法检索到预期的结果,因为字符在最后 url 中发生了变化。 这是我目前拥有的代码

 val WRITTEN_IN_PARAM: String = "+language:"
 val builtUri: Uri = Uri.parse(GITHUB_BASE_URL).buildUpon()
                .appendQueryParameter(REPO_NAME_PARAM, repoName+ WRITTEN_IN_PARAM+"Kotlin")
                .build()

2B2B,这是个问题。 :)

问题是 URL 参数被 URL 编码了两次。当我们在 HTTP 查询中发送某些字符时,需要对它们进行编码。一种编码(被认为是快捷方式)是将 space 转换为 + 符号。编码 space 的正确方法是使用 %20.

但是,当上面的代码获取已经编码的字符串时,它不知道 + 已经从 space 编码并尝试再次编码(使用 %2B, +) 的编码。

如果您点击 URL 您提供的 %20 代替 +,并且 %3A 代替 :,它应该工作正常。因此,解决方法是不发送 + 除非你真的想要 +,在这种情况下它将被正确编码为 %2B.

修复: 正在使用的库似乎可以正确编码字符串,只需将 + 保留为 space 它应该会给你你想要的需要。

Here is a good list of characters and their encoding,有兴趣的话