Retrofit 2.0 beta1: как отправить исходное тело String
Я ищу способ отправить запрос с необработанным телом с помощью новой Retrofit 2.0b1. Что-то вроде этого:
@POST("/token")
Observable<TokenResponse> getToken(@Body String body);
Насколько я понимаю, должен быть какой-то конвертер "в строку", но пока не ясно, как он работает.
Были способы сделать это в 1.9 с помощью TypedInput, но он больше не помогает в версии 2.0.
PS да, бэкэнд глуп, насколько я вижу, никто не изменит его для меня: (
Спасибо за помощь.
Ответы
Ответ 1
Вам необходимо зарегистрировать конвертер для Type
при создании Retrofit
с помощью addConverter(type, converter)
.
Converter<T>
в 2.0 использует аналогичный подход, используя старый конвертер в версии 1.x.
Ваш StringConverter
должен выглядеть примерно так:
public class StringConverter implements Converter<Object>{
@Override
public String fromBody(ResponseBody body) throws IOException {
return ByteString.read(body.byteStream(), (int) body.contentLength()).utf8();
}
@Override
public RequestBody toBody(Object value) {
return RequestBody.create(MediaType.parse("text/plain"), value.toString());
}
}
Примечания:
-
ByteString
из библиотеки Okio.
- Обратите внимание на
Charset
в MediaType
Ответ 2
В Retrofit 2.0.0-beta2 вы можете использовать RequestBody
и ResponseBody
для публикации тела на сервер с использованием данных String
и чтения из тела ответа сервера как String
.
Сначала вам нужно объявить метод в RetrofitService:
interface RetrofitService {
@POST("path")
Call<ResponseBody> update(@Body RequestBody requestBody);
}
Затем вам нужно создать объект RequestBody
и Call
:
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://somedomain.com").build();
RetrofitService retrofitService = retrofit.create(RetrofitService.class);
String strRequestBody = "body";
RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"),strRequestBody);
Call<ResponseBody> call = retrofitService.update(requestBody);
И, наконец, сделайте запрос и прочитайте тело ответа как String
:
try {
Response<ResponseBody> response = call.execute();
if (response.isSuccess()) {
String strResponseBody = response.body().string();
}
} catch (IOException e) {
// ...
}