Получение неполного ответа от модернизации - PullRequest
6 голосов
/ 29 октября 2019

Я использую модифицированную версию 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-ответ будет иметь ограничение по размеру и использовал читатель для доступа к json из URL, выполнивспособ.

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 Ответ

5 голосов
/ 06 ноября 2019

В конце концов я понял, почему это происходит. Не было проблем с HTTP-запросом. Но из-за его ограниченного размера буфера печатается только его часть.

Для двоичных журналов существует ограничение в размере 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, установите флажок рядом с параметром Переопределить размер буфера цикла консоли и введите число.

Мне так неловко, но спасибо за вашу поддержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...