Как решить, использовать ли загруженную загрузку в OKTTP или нет?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как решить, использовать ли загруженную загрузку в OKTTP или нет?

Сообщение Anonymous »

Я загружаю файлы на серверы WebDav с помощью < /p>
RequestBody requestBody = new MultipartBody.Builder()
.addPart(RequestBody.create(data, MediaType.parse("application/binary")))
.build();
Request request = new Request.Builder()
.url(new URL(ci.URL))
.put(requestBody)
.build();
client.newCall(request).execute();

Хотя это работает для многих пользователей (с разными серверами), он не работает хотя бы для одного пользователя, использующего экземпляр NextCloud, возвращая 503.
Я сравнил с тем, что сделал Curl , и увидел, что он использует Chunked загрузки. Поэтому я заменил тело запроса < /p>
RequestBody requestBody = new RequestBody() {
@Override
public MediaType contentType() {
return MediaType.parse("application/binary");
}

@Override
public void writeTo(BufferedSink sink) throws IOException {
try (InputStream in = new ByteArrayInputStream(data)) {
byte[] buffer = new byte[64 * 1024];
int read;
while ((read = in.read(buffer)) != -1) {
sink.write(buffer, 0, read);
sink.flush();
}
}
}

@Override
public long contentLength() {
return -1; // use chunked upload
}
};
< /code>
И это работает для этого конкретного сервера. < /p>
Мой вопрос: как я узнаю, лучше ли загрузка загруженной загрузки, чем загрузка "один блок"? Как узнать, поддерживает ли сервер вообще загруженной загрузкой? Как выбрать размер чанка? Похоже, что сервер имеет предел 2^16 байтов для одного запроса, но это может отличаться от сервера к серверу, не так ли? Для полноты, вот как я создаю своего клиента :
final OkHttpClient baseClient = new OkHttpClient();
...
OkHttpClient.Builder builder = baseClient.newBuilder();
final Map authCache = new ConcurrentHashMap();

com.burgstaller.okhttp.digest.Credentials credentials = new com.burgstaller.okhttp.digest.Credentials(ci.username, ci.password);
final BasicAuthenticator basicAuthenticator = new BasicAuthenticator(credentials);
final DigestAuthenticator digestAuthenticator = new DigestAuthenticator(credentials);

DispatchingAuthenticator authenticator = new DispatchingAuthenticator.Builder()
.with("digest", digestAuthenticator)
.with("basic", basicAuthenticator)
.build();

builder = builder.authenticator(new CachingAuthenticatorDecorator(authenticator, authCache))
.addInterceptor(new AuthenticationCacheInterceptor(authCache));
client = builder.build()



Подробнее здесь: https://stackoverflow.com/questions/795 ... ttp-or-not
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»