Подтвердить что ты не робот

Retrofit 2.0 beta1: как отправить исходное тело String

Я ищу способ отправить запрос с необработанным телом с помощью новой Retrofit 2.0b1. Что-то вроде этого:

@POST("/token")
Observable<TokenResponse> getToken(@Body String body);

Насколько я понимаю, должен быть какой-то конвертер "в строку", но пока не ясно, как он работает.

Были способы сделать это в 1.9 с помощью TypedInput, но он больше не помогает в версии 2.0.

PS да, бэкэнд глуп, насколько я вижу, никто не изменит его для меня: (

Спасибо за помощь.

4b9b3361

Ответ 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) {
    // ...
}