Я работаю над приложением, которое использует Retrofit для сетевых операций. В его нынешнем виде все работает хорошо с GsonConverterFactory
, обрабатывающим сериализацию. Вот как я настраиваю Retrofit
Retrofit.Builder()
.baseUrl("<base url>")
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
Теперь мне нужно подключиться к устаревшей службе, которая возвращает контент в формате text/plain; charset=utf-8
. Вот интерфейс Retrofit
@GET("https://<domain>/<endpoint>?Type=Query")
suspend fun callStatus(@Query("userId") id: Int): Response<String>
Это вернет статус вызова для действительного пользователя. Например, если пользователь действителен и есть статус, он возвращает «Активный» в виде обычного текста. Если действующего пользователя нет, он возвращает код ошибки # 1005
Я мог бы добавить фабрику настраиваемых преобразователей, как это (найдено в Интернете)
final class StringConverterFactory implements Converter.Factory {
private StringConverterFactory() {}
public static StringConverterFactory create() {
return new StringConverterFactory();
}
@Override
public Converter<String> get(Type type) {
Class<?> cls = (Class<?>) type;
if (String.class.isAssignableFrom(cls)) {
return new StringConverter();
}
return null;
}
private static class StringConverter implements Converter<String> {
private static final MediaType PLAIN_TEXT = MediaType.parse("text/plain; charset=UTF-8");
@Override
public String fromBody(ResponseBody body) throws IOException {
return new String(body.bytes());
}
@Override
public RequestBody toBody(String value) {
return RequestBody.create(PLAIN_TEXT, convertToBytes(value));
}
private static byte[] convertToBytes(String string) {
try {
return string.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
}
Но я не видел это имеет значение. Кроме того, он мог замаскировать JSON как обычный текст и сломать все существующие службы. Есть ли лучший способ справиться с этим сценарием? Я подумал о том, чтобы иметь отдельный экземпляр модификации для простого текста, хотя и немного грязного. У вас есть другие предложения / решения?
Отредактировано
Заголовок ответа содержит тип содержимого как Content-Type: text/plain; charset=utf-8
Фактический ответ для действительного пользователя
Active
Фактический ответ для недопустимого пользователя
#1005