2015-09-18 5 views
12

Sto cercando un modo per inviare la richiesta con il corpo grezzo con il nuovo Retrofit 2.0b1. Qualcosa di simile a questo:Retrofit 2.0 beta1: come pubblicare il corpo grezzo della stringa

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

Per quanto ho capito, ci dovrebbe essere una sorta di stretto convertitore "a-string", ma non è chiaro per me ancora come funziona.

C'erano modi per farlo accadere in 1.9 con TypedInput, ma non aiuta più in 2.0.

PS Sì, il backend è stupido, per quanto vedo nessuno cambierà per me :(

Grazie per l'aiuto.

risposta

7

Si dovrebbe essere registrando un convertitore per il vostro Type quando si sta costruendo il vostro Retrofit utilizzando addConverter(type, converter).

Converter<T> a 2.0 utilizza approccio simile utilizzando vecchia Converter in versione 1.x.

tuo StringConverter sho ULD essere qualcosa di simile:

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

Note:

  1. ByteString da biblioteca Okio.
  2. Mind the Charset nel vostro MediaType
+0

Ho appena trovato come farlo pure. Grazie! –

23

In retrofit 2.0.0-beta2 è possibile utilizzare RequestBody e ResponseBody di inviare un corpo di server utilizzando i dati String e leggere dal corpo della risposta del server come String.

prima cosa è necessario dichiarare un metodo nella vostra RetrofitService:

interface RetrofitService { 
    @POST("path") 
    Call<ResponseBody> update(@Body RequestBody requestBody); 
} 

Dopodiché è necessario creare un RequestBody e Call oggetto:

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

E infine fare una richiesta e leggere corpo di risposta come String:

try { 
    Response<ResponseBody> response = call.execute(); 
    if (response.isSuccess()) { 
     String strResponseBody = response.body().string(); 
    } 
} catch (IOException e) { 
    // ... 
} 
+0

Grazie mille. Bella soluzione –

+0

Questa dovrebbe essere la risposta valida. –