从改造中收到不完整的响应
Receiving incomplete response from retrofit
我正在使用改造版本 2.6.1
通过网络发出 http 请求。我期望的 JSON 长度为 42466 个字符。但是,我只收到 4073 个字符并且 API 在网络浏览器和 postman.
上工作正常
所以我添加了自定义 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 客户端和拦截器分配给 retrofit builder,这就是它的样子
private val centralRetrofit = Retrofit.Builder().baseUrl("https://www.********.com/")
.addConverterFactory(ScalarsConverterFactory.create())
.client(okHttpClient)
.build()
.create(MusicAccess::class.java)
所以,我认为使用 post 请求会帮助我,而不是获取并尝试以字符串格式获取所有响应来检查响应
@Headers("Content-Type: text/html; charset=UTF-8")
@POST("**********")
fun getMusic(): Call<String>
但之后也没有得出结论,我认为http响应会有大小限制,并使用reader通过以下方式从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))
但是正如这个 回答状态我们不能配置 OkHttpClient 从缓冲区读取超过 2048 字节
请问有什么方法可以一次获取所有数据吗?
最后我明白了为什么会这样。
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,
选中覆盖控制台循环缓冲区大小旁边的框,然后输入数字。
感觉好尴尬,不过谢谢大家的支持
我正在使用改造版本 2.6.1
通过网络发出 http 请求。我期望的 JSON 长度为 42466 个字符。但是,我只收到 4073 个字符并且 API 在网络浏览器和 postman.
所以我添加了自定义 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 客户端和拦截器分配给 retrofit builder,这就是它的样子
private val centralRetrofit = Retrofit.Builder().baseUrl("https://www.********.com/")
.addConverterFactory(ScalarsConverterFactory.create())
.client(okHttpClient)
.build()
.create(MusicAccess::class.java)
所以,我认为使用 post 请求会帮助我,而不是获取并尝试以字符串格式获取所有响应来检查响应
@Headers("Content-Type: text/html; charset=UTF-8")
@POST("**********")
fun getMusic(): Call<String>
但之后也没有得出结论,我认为http响应会有大小限制,并使用reader通过以下方式从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))
但是正如这个 回答状态我们不能配置 OkHttpClient 从缓冲区读取超过 2048 字节
请问有什么方法可以一次获取所有数据吗?
最后我明白了为什么会这样。 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,
选中覆盖控制台循环缓冲区大小旁边的框,然后输入数字。
感觉好尴尬,不过谢谢大家的支持