【问题标题】:Response is url encoded when using Retrofit使用 Retrofit 时响应是 url 编码的
【发布时间】:2021-11-13 16:46:42
【问题描述】:

当我使用常规 HttpURLConnectionBufferedReader 时,我得到的只是纯 unicode 文本,结果为 String

val url = URL(urlStr)
val response = StringBuilder()
val con: HttpURLConnection = url.openConnection() as HttpURLConnection
con.setRequestProperty("User-Agent", "Mozilla/5.0")
val bufferedReader = BufferedReader(InputStreamReader(con.inputStream))
var inputLine: String?
while (bufferedReader.readLine().also { inputLine = it } != null) {
    response.append(inputLine)
}
bufferedReader.close()

return response.toString()

我尝试使用ScalarsConverterFactory 将此请求迁移到Retrofit,并从我的改造服务方法中获取字符串。这个解决方案的问题是,现在来自 Retrofit 的结果字符串是 url 编码的(如 "%C2 %96"):

  @Headers("User-Agent: Mozilla/5.0")
    @GET("single?client=gtx&dt=t")
    suspend fun getTranslation(
        @Query("sl") sourceLanguage: String,
        @Query("tl") targetLanguage: String,
        @Query("q") text: String,
    ): String

我尝试使用URLDecoder,但收到URLDecoder: Illegal hex characters in escape (%) pattern 错误。

  1. 为什么 Retrofit 返回 url 编码的字符串?
  2. 我应该如何正确解码这个字符串以避免错误?
  3. 我怎样才能改变这种行为,只得到普通(未编码)的字符串,比如HttpURLConnection

【问题讨论】:

    标签: android retrofit2 httpurlconnection urlencode


    【解决方案1】:

    您看我之前遇到过这个错误,但我发现原因很简单,解决方案是当您发出请求时,它会将响应作为图像提供给您,然后您对图像进行解码,并且响应在您看来是加密的但是这件事不在您的脑海中,并且响应似乎被加密了,因为它返回了二进制文件。 您所要做的就是直接使用带有您需要的参数的URL,就是这样

    【讨论】:

    • 在我的情况下,响应只是文本(json)。正如我在问题中提到的,当我使用普通的 HttpURLConnection 时,一切正常。所以我认为这个问题与RetrofitOkio有关。
    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多