2016-01-29 36 views
9

uso Retrofit da molto tempo ma dopo questo enorme aggiornamento, è stato un po 'difficile :) Il mio problema è che ho bisogno di inviare una richiesta di posta come formUrlEncoded all'interno di un'immagine codificata base64.Retrofit2 Invia immagine come base64

senza immagine, la richiesta di seguito funziona bene

@FormUrlEncoded 
@POST("mypath") 
Call<BooleanResponse> updateUser(@FieldMap HashMap<String, String> updatedValues); 

Ma quando ho cercato di includere un'immagine, Base64 codificato e quindi ottengo Internal Server Error -che so che non si tratta di lato server perché io avere un'altra applicazione che chiama questo servizio con HttpPost e che funziona bene.

Ecco come ottengo i dati di base64 dall'immagine e aggiungo questo nella mappa che passerò anche alla richiesta di updateUser, ma non funziona.

public static String getProfileImage(ImageView imageView) { 
    imageView.buildDrawingCache(); 
    Bitmap bm = imageView.getDrawingCache(); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bm.compress(Bitmap.CompressFormat.JPEG, 40, baos); 
    byte[] b = baos.toByteArray(); 
    return Base64.encodeToString(b, Base64.DEFAULT); 
} 

Come ho cercato, ho trovato che Retrofit uso di alcune serializzazioni su richiesta, tramite GSON a meno che io dico di non farlo! As in this question

Ma non riuscivo a capire come metterlo come in Retrofit2, qualche suggerimento?

+0

Vuoi pubblicare Base64 come campo modulo/parametro? o nel corpo? –

+0

come parametro di forma @ VaibhavA.Jani – yahya

+0

Il problema potrebbe essere la tua "Base64 String" sarà UrlEncoded provare a decodificarlo a fine server. O incapsulare in "POJO (plain java object)" in modo che venga inviato come campo Json all'interno dell'oggetto Json e venga serializzato correttamente. TypedString viene rimosso da Retrofit2! –

risposta

4

Ho trovato la soluzione. Aggiornato richiesta di servizio come di seguito

@POST("mypath") 
Call<BooleanResponse> updateUser(@Body RequestBody updatedBody); 

e ha creato un oggetto RequestBody da updatedValues ​​mappa e utilizzati al di sopra richiesta invece.

FormBody.Builder bodyBuilder = new FormBody.Builder(); 
Iterator it = changedFieldsMap.entrySet().iterator(); 
while (it.hasNext()) { 
     Map.Entry pair = (Map.Entry) it.next(); 
     bodyBuilder.add((String) pair.getKey(), (String) pair.getValue()); 
     it.remove(); // avoids a ConcurrentModificationException 
} 
RequestBody requestBody = bodyBuilder.build(); 
serviceManager.updateUser(requestBody); 
+0

puoi spiegare qual è il contenuto di changedFieldsMap? Dove metti l'immagine della stringa base64? –