2016-01-29 23 views
9

Tôi đã sử dụng Retrofit trong một thời gian dài nhưng sau bản cập nhật lớn này, nó hơi khó chút :) Vấn đề của tôi là tôi cần gửi yêu cầu đăng bài dưới dạng formUrlEncoded trong base64 được mã hóa hình ảnh.Retrofit2 Đăng ảnh dưới dạng base64

Nếu không có hình ảnh, các yêu cầu dưới đây chỉ hoạt động tốt

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

Nhưng khi tôi đã cố gắng để bao gồm hình ảnh, Base64 mã hóa cũng sau đó tôi nhận được Internal Server Error -which tôi biết nó không phải là về phía máy chủ, vì tôi có một ứng dụng khác gọi dịch vụ này bằng HttpPost và hoạt động tốt.

Đây là cách tôi lấy dữ liệu base64 từ hình ảnh và tôi thêm dữ liệu này vào bản đồ mà tôi cũng sẽ chuyển sang yêu cầu updateUser, nhưng điều đó không hoạt động.

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

Khi tôi tìm kiếm, tôi thấy rằng Retrofit sử dụng một số serializations theo yêu cầu qua Gson trừ khi tôi yêu cầu không làm như vậy! As in this question

Nhưng tôi không thể tìm ra cách đặt nó như trong Retrofit2, bất kỳ đề xuất nào?

+0

Bạn có muốn đăng Base64 làm trường/tham số biểu mẫu không? hoặc trong thân thể? –

+0

dưới dạng tham số biểu mẫu @ VaibhavA.Jani – yahya

+0

Sự cố có thể là "Chuỗi Base64" của bạn sẽ được UrlEncoded thử giải mã nó ở cuối máy chủ. HOẶC gói gọn nó trong "POJO (đối tượng java thuần túy)" để nó sẽ được gửi dưới dạng trường Json trong đối tượng Json và sẽ được tuần tự hóa đúng cách. TypedString bị xóa khỏi Retrofit2! –

Trả lời

4

Tôi đã tìm thấy giải pháp. Cập nhật yêu cầu dịch vụ như sau

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

Và tạo ra một đối tượng RequestBody từ bản đồ updatedValues ​​và sử dụng trên yêu cầu để thay thế.

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

bạn có thể giải thích những gì là chứa của changesFieldsMap? Bạn đặt hình ảnh chuỗi base64 ở đâu? –

Các vấn đề liên quan