До сих пор я использовал OkHttp для своих сетевых запросов, но теперь я хочу использовать Retrofit (v2) для использования. Сервер, с которым я общаюсь, требует AuthToken либо как часть URL-адреса (запрос GET), либо внутри тела (запрос POST). Мне также нужно отделить создание запросов от выполнения, что является очень хорошей функцией Retrofit. Я могу передать объект Call и выполнить его/позже.Изменение запроса POST Тело при использовании Дооснащение/OkHttp
Жесткая часть заключается в том, что AuthToken может быть недоступен при создании запроса, и мне нужно будет его модифицировать, прежде чем он будет выполнен. До сих пор я добавлял фиктивный authToken во время создания и заменяю перед выполнением. Это довольно просто для запроса GET, поскольку я могу добавить Interceptor в OkHttpClient, чтобы изменить URL-адрес запроса, но изменение тела запроса POST - это то, с чем я борюсь.
Итак, есть ли поддержка для этого варианта использования в модификации/OkHttp?
Некоторые не работает пример кода, который будет практически сделать трюк (пытается добавить authToken всегда при наличии, заканчивается: java.lang.IllegalStateException: Не могу течь в тело запроса без фрагментированного кодирования или известной длиной контента
client.networkInterceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (request.body() == null) {
return chain.proceed(request);
}
Request authorizedRequest = request.newBuilder()
.method(request.method(), replaceDummyAuth(request.body()))
.build();
return chain.proceed(authorizedRequest);
}
private RequestBody replaceDummyAuth(final RequestBody body) {
return new RequestBody() {
@Override
public MediaType contentType() {
return body.contentType();
}
@Override
public long contentLength() throws IOException {
return -1;
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
ParametersMap map = new ParametersMap();
BufferedSink authSink = Okio.buffer(sink);
body.writeTo(authSink);
String authToken = SessionManager.getAuthToken();
if(StringUtils.hasText(authToken)) {
map.put("authToken", authToken);
String paramString = map.getParameterString();
authSink.write(paramString.getBytes("UTF-8"));
}
authSink.close();
}
};
}
});
Почему длина содержания -1? является ли она архивированная? –
нет, это не gzipped, я просто не знаю, как реализовать contentLength(). Если я поставлю: return body.contentLength(); t "java.net.ProtocolException: ожидается 0 байт, но получено 111" – pmellaaho