给 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()
2B
不2B
,这是个问题。 :)
问题是 URL 参数被 URL 编码了两次。当我们在 HTTP 查询中发送某些字符时,需要对它们进行编码。一种编码(被认为是快捷方式)是将 space 转换为 +
符号。编码 space 的正确方法是使用 %20
.
但是,当上面的代码获取已经编码的字符串时,它不知道 +
已经从 space 编码并尝试再次编码(使用 %2B
, +
) 的编码。
如果您点击 URL 您提供的 %20
代替 +
,并且 %3A
代替 :
,它应该工作正常。因此,解决方法是不发送 +
除非你真的想要 +
,在这种情况下它将被正确编码为 %2B
.
修复: 正在使用的库似乎可以正确编码字符串,只需将 +
保留为 space 它应该会给你你想要的需要。
所以,我有我的基础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()
2B
不2B
,这是个问题。 :)
问题是 URL 参数被 URL 编码了两次。当我们在 HTTP 查询中发送某些字符时,需要对它们进行编码。一种编码(被认为是快捷方式)是将 space 转换为 +
符号。编码 space 的正确方法是使用 %20
.
但是,当上面的代码获取已经编码的字符串时,它不知道 +
已经从 space 编码并尝试再次编码(使用 %2B
, +
) 的编码。
如果您点击 URL 您提供的 %20
代替 +
,并且 %3A
代替 :
,它应该工作正常。因此,解决方法是不发送 +
除非你真的想要 +
,在这种情况下它将被正确编码为 %2B
.
修复: 正在使用的库似乎可以正确编码字符串,只需将 +
保留为 space 它应该会给你你想要的需要。