所以,我有我的基本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()
答案 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,如果您有兴趣。