【问题标题】:Receiving incomplete response from retrofit从改造中收到不完整的响应
【发布时间】:2020-02-25 03:49:15
【问题描述】:

我正在使用改造版本 2.6.1 通过网络发出 http 请求。我期望的 JSON 长度为 42466 个字符。但是,我只收到 4073 个字符,并且 API 在网络浏览器和邮递员上运行良好。

所以我添加了自定义 okhttp 客户端并增加了超时,但这对我没有帮助。

private var okHttpClient: OkHttpClient = OkHttpClient().newBuilder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(10, TimeUnit.SECONDS)
    .build()

然后我尝试添加一个日志拦截器,我发现 okhttp 正在接收我想要的拦截器日志中的响应,但以块的形式。

private val httpInterceptor: HttpLoggingInterceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
private var okHttpClient: OkHttpClient = OkHttpClient().newBuilder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(10, TimeUnit.SECONDS)
    .addInterceptor(httpInterceptor)
    .build()

最后,我将 http 客户端和拦截器分配给了改造构建器,这就是它的样子

private val centralRetrofit = Retrofit.Builder().baseUrl("https://www.********.com/")
    .addConverterFactory(ScalarsConverterFactory.create())
    .client(okHttpClient)
    .build()
    .create(MusicAccess::class.java)

所以,我认为使用发布请求会帮助我,而不是获取并尝试以字符串格式获取所有响应来检查响应

@Headers("Content-Type: text/html; charset=UTF-8")
@POST("**********")
fun getMusic(): Call<String>

但之后也没有得出结论,我认为http响应会有大小限制,并使用阅读器通过以下方式从url访问json。

val client = OkHttpClient()
val request = Request.Builder().url("********")
    .addHeader("Content-Type", "application/json")
    .build()
val response = client.newCall(request).execute()
val input = response.body()?.byteStream()
val reader = BufferedReader(InputStreamReader(input))

但是正如https://stackoverflow.com/a/26023885/7639056 的回答状态,我们无法将 OkHttpClient 配置为从缓冲区读取超过 2048 个字节

那么有什么方法可以一次获取所有数据?

【问题讨论】:

    标签: android retrofit retrofit2 okhttp


    【解决方案1】:

    最终我明白了为什么会这样。 HTTP 请求没有问题。但由于缓冲区大小有限,只有一部分被打印在 logcat 中。

    二进制日志的大小限制为 1024 字节。非二进制日志的大小限制如下所示。

    #define LOGGER_ENTRY_MAX_LEN        (4*1024)
    #define LOGGER_ENTRY_MAX_PAYLOAD (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry))
    

    要将限制设置为更大的数字,Preferences/Settings -&gt; Editor -&gt; General -&gt; Console, 选中覆盖控制台循环缓冲区大小旁边的框,然后输入数字。

    我感到很尴尬,但感谢您的支持。

    【讨论】:

    • 你不必感到尴尬。我见过更糟糕的。 ?
    • 感谢您提供此信息。多次成为日志的受害者?
    • 看看木材。它应该通过DebugTree 解决这个问题。
    • 啊哈哈,非常感谢,我对发生的事情不知所措,现在我把所有东西都带进了 TextView,一切正常。我什至不知道 LogCat 的内存。
    猜你喜欢
    • 2021-04-09
    • 2018-12-03
    • 2016-06-03
    • 2021-04-02
    • 2015-08-22
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多