2015-09-18 4 views
12

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

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

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

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

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

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

ответ

7

Вы должны регистрировать конвертер для Type, когда вы строите ваш Retrofit используя addConverter(type, converter).

Converter<T> в 2.0 использует подобный подход, используя старый конвертер в 1.x версии.

Ваш StringConverter шо ÜLD быть что-то вроде этого:

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()); 
    } 
} 

Примечания:

  1. ByteString от библиотеки Окио.
  2. виду Charset в вашем MediaType
+0

У меня есть просто нашел, как это сделать. Благодаря! –

23

В Модернизированный 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) { 
    // ... 
} 
+0

Большое вам спасибо. Хорошее решение –

+0

Это должен быть верный ответ. –

Смежные вопросы