在Kotlin的Uri中添加特殊字符

时间:2019-07-15 12:45:32

标签: kotlin uri

所以,我有我的基本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取代。由于最终网址中的字符已更改,因此这导致应用无法检索预期的结果。 这是我目前拥有的代码

 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()

1 个答案:

答案 0 :(得分:2)

2B还是不是2B,这就是问题所在。 :)

问题是URL参数被两次URL编码。当我们在HTTP查询中发送某些字符时,需要对其进行编码。一种编码(考虑为快捷方式)是将空格变成+符号。正确编码空格的方法是使用%20

但是,当上面的代码获取到已经编码过的String时,它不知道+已经从空格中进行编码,然后尝试再次对其进行编码(使用%2B,{ {1}})。

如果您点击+代替%20并用+代替%3A的URL,它应该可以正常工作。因此,解决方法是除非您确实需要:,否则不要发送+,在这种情况下,它将被正确编码为+

修复::正在使用的库似乎可以正确编码字符串,只需将%2B留为空格即可,它应该可以为您提供所需的内容。

Here is a good list of characters and their encoding,如果您有兴趣。