收到改造的不完全答复

时间:2019-10-29 20:57:14

标签: android retrofit retrofit2 okhttp

我正在使用翻新版本2.6.1来通过网络发出http请求。我期望的JSON长42466个字符。但是,我只收到4073个字符,并且API在Web浏览器和邮递员上工作正常。

因此,我添加了自定义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个字节

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

1 个答案:

答案 0 :(得分:5)

最终我弄清楚了为什么会这样。 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 -> Editor -> General -> Console,选中“覆盖控制台循环缓冲区大小”旁边的框,然后输入数字。

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