2016-01-29 10 views
9

मैं लंबे समय से रेट्रोफिट का उपयोग कर रहा हूं लेकिन इस विशाल अपडेट के बाद, यह थोड़ा कठिन रहा है :) मेरी समस्या है कि मुझे एक फॉर्म एन्कोडेड बेस 64 के भीतर फॉर्मूरल एन्कोडेड के रूप में एक पोस्ट अनुरोध भेजने की आवश्यकता है।रेट्रोफिट 2 पोस्ट छवि बेस 64

छवि के बिना, नीचे अनुरोध ठीक

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

काम करता है लेकिन जब मैं छवि शामिल करने की कोशिश की, Base64 रूप में अच्छी तरह से इनकोडिंग तो मैं मिलता आंतरिक सर्वर त्रुटि -which मैं यह पता सर्वर साइड के बारे में नहीं है क्योंकि मैं HttpPost के साथ इस सेवा को कॉल करने वाला एक और एप्लिकेशन है और यह ठीक काम करता है।

यह मैं छवि से base64 डेटा कैसे हो और मैं नक्शा है कि मैं updateUser अनुरोध के रूप में अच्छी तरह से पारित करेंगे में इस ऐड है, लेकिन यह सिर्फ काम नहीं कर रहा है।

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

के रूप में मैं तो पाया कि रेट्रोफिट अनुरोध पर कुछ serializations का उपयोग Gson के माध्यम से जब तक मैं यह बताना ऐसा करने के लिए नहीं! As in this question

लेकिन मैं समझ नहीं सकता कैसे Retrofit2 में के रूप में यह डाल करने के लिए, किसी भी सुझाव?

+0

क्या आप बेस 64 को फॉर्म फ़ील्ड/पैरामीटर के रूप में पोस्ट करना चाहते हैं? या शरीर में? –

+0

प्रपत्र पैरामीटर @ VaibhavA.Jani – yahya

+0

मुद्दा अपने "Base64 स्ट्रिंग" हो सकता है के रूप में urlencoded सर्वर अंत में इसे डीकोड कोशिश हो जाएगा। या इसे "पीओजेओ (सादा जावा ऑब्जेक्ट)" के भीतर encapsulate करें, तो यह जेसन ऑब्जेक्ट के भीतर जेसन क्षेत्र के रूप में भेजा जाएगा और क्रमशः serialized मिल जाएगा। TypedString Retrofit2 से हटा दिया गया है! –

उत्तर

4

मैं समाधान मिल गया।

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

और अद्यतन अनुरोध मोड से अनुरोधबॉडी ऑब्जेक्ट बनाया और इसके बजाय अनुरोध के ऊपर उपयोग किया गया।

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

क्या आप समझा सकते हैं कि बदल गए फ़ील्ड मैप के क्या हैं? आप बेस 64 स्ट्रिंग छवि कहां डालते हैं? –

संबंधित मुद्दे