2016-01-29 14 views
9

Używam Retrofit przez długi czas, ale po tej wielkiej aktualizacji, to było trochę trudne :) Moim problemem jest wysłanie żądania postu jako formUrlEncoded w kodowanym base64.Retrofit2 Post image as base64

Bez obrazu, poniżej wniosek działa dobrze

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

Ale kiedy próbowałem to obraz zakodowany Base64 także wtedy ja dostać Internal Server Error-co wiem to nie chodzi o to, bo po stronie serwera mieć inną aplikację wywołującą tę usługę za pomocą HttpPost i działa dobrze.

W ten sposób otrzymuję dane base64 z obrazu i dodaję to do mapy, która również przejdzie do żądania updateUser, ale to po prostu nie działa.

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

Jak szukałem, znalazłem, że Retrofit korzystać z niektórych serializations na żądanie poprzez Gson chyba powiem jej tego nie robić! As in this question

Ale nie mogłem wymyślić, jak umieścić go w Retrofit2, jakieś sugestie?

+0

Czy chcesz opublikować Base64 jako pole/parametr formularza? lub w ciele? –

+0

jako parametr formularza @ VaibhavA.Jani – yahya

+0

Problem może być twój "String Base64" będzie UrlEncoded spróbuj dekodować go na końcu serwera. LUB enkapsuluj go w "POJO (zwykły obiekt java)", więc zostanie wysłany jako pole Json w obiekcie Json i zostanie poprawnie zserializowany. TypedString został usunięty z Retrofit2! –

Odpowiedz

4

Znalazłem rozwiązanie. Zaktualizowane zgłoszenie serwisowe poniżej:

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

Utworzono obiekt RequestBody z zaktualizowanej mapy mapy i wykorzystano powyżej żądanie.

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

czy możesz wyjaśnić, co jest zawarte w changedFieldsMap? Gdzie umieszczasz obraz łańcucha base64? –