2014-10-29 14 views
10

मैं http पोस्ट अनुरोध के शरीर के रूप में नीचे दिए गए प्रारूप की एक स्ट्रिंग पास करने का प्रयास कर रहा हूं।मेरे http अनुरोध निकाय एन्कोडिंग से रेट्रोफिट को रोकें

param1=PARAM1&param2=PARAM2&param3=PARAM3 

लेकिन पुराना वापस मेरे शरीर को कूटबद्ध ताकि = \ u003d हो जाता है और & \ u0026 हो जाता है। और मैं एक स्ट्रिंग के साथ समाप्त होता हूं जो वास्तव में इस तरह दिखता है:

param1\u003dPARAM1\u0026param2\u003dPARAM2\u0026param3\u003dPARAM3 

मैं इसे कैसे रोक सकता हूं?

मेरा रेट्रोफिट आराम एपीआई निम्नानुसार परिभाषित किया गया है।

public interface RestAPI { 
    @POST("/oauth/token") 
    public void getAccessToken(@Body String requestBody, Callback<Response> response); 
} 

उत्तर

7

सीधे प्रश्न का उत्तर देने के लिए, आप विधि पैरामीटर प्रकार के रूप में TypedString का उपयोग कर सकते हैं। मान बदल रहा है क्योंकि JSON के रूप में एन्कोड करने के लिए रेट्रोफिट String को जीसन में सौंप रहा है। TypedString या किसी भी TypedOutput सबक्लास का उपयोग इस व्यवहार को रोक देगा, मूल रूप से रेट्रोफिट को बताएगा कि आप प्रत्यक्ष अनुरोध निकाय स्वयं को संभालने में संभाल लेंगे।

हालांकि, पेलोड के उस प्रारूप को फॉर्म यूआरएल एन्कोडिंग कहा जाता है। रेट्रोफिट के लिए मूल समर्थन है। आपका विधि घोषणा वास्तव में इस तरह दिखना चाहिए:

@FormUrlEncoded 
@POST("/oauth/token") 
void getAccessToken(
    @Field("param1") String param1, 
    @Field("param2") String param2, 
    @Field("param3") String param3, 
    Callback<Response> callback); 
+8

मैं कक्षा को कक्षा के रूप में पोस्ट करने की कोशिश कर रहा हूं लेकिन इसमें कुछ चर "एन्क्रिप्टेड स्ट्रिंग्स जैसे" 66PdGFKsvyyYaVTGJ/nAYQ == "शामिल हैं ... किसी भी विचार को = संकेतों को \ u003d – vezikon

8

आप अनुरोध शरीर में एक धारावाहिक वर्ग (एक HashMap की तरह) है और आप एन्कोडिंग कि (vezikon के दशक में और मेरी समस्या की तरह), आप बना सकते हैं रोकना चाहते हैं विकलांग एस्केपिंग के साथ एक कस्टम Gson का उपयोग कर:

Gson gson = new GsonBuilder().disableHtmlEscaping().create(); 

अपने बाकी एडाप्टर के लिए इस कनवर्टर दर्रा:

yourRestAdapter = new RestAdapter.Builder() 
    .setEndpoint(.....) 
    .setClient(.....) 
    .setConverter(new GsonConverter(gson)) 
    .build(); 

इस तरह "=" पोस्ट शरीर में पात्रों बरकरार रहने जमा करते समय।

+0

inretrofit 2 में परिवर्तित करने से रोकने के लिए, हम कर सकते हैं इसका उपयोग इस – Choletski

+2

जैसा नहीं है, यह उत्तर रेट्रोफिट 1 दिनों से है, लेकिन क्या आप इसका उपयोग रेट्रोफिट 2 में उसी तरह नहीं कर सकते? (मैंने इसका परीक्षण नहीं किया है): जीसन जीसन = नया जीसनबिल्डर()। अक्षम एचटीएमएलएस्केपिंग()। बनाएँ(); रेट्रोफिट रेट्रोफिट = नया रेट्रोफिट.बिल्डर()। बेसयूआरएल (BASE_URL) .addConverterFactory (GsonConverterFactory.create (gson))। क्लाइंट (okHttpClient) .build(); –

+0

RestAdapter क्या है? @ MuratÖgat –

1

यह समस्या नीचे दिए गए कामकाज के साथ तय की जा सकती है।

@POST("yourString") 
Call<YourResponseModel> yourCallMethod(@Query("yourKey") String yourValue, 
              @Query("yourKey") String yourValue, 
              @Query("yourKey") String yourValue); 

नोट: इस मामले के लिए "@FormUrlEncoded" का उपयोग न करें।

Reference Here - https://github.com/square/retrofit/issues/1407

0

रेट्रोफिट 2 के लिए आप एक Gson कनवर्टर कारखाने के साथ पुराना वापस प्रारंभ कर सकते हैं।

val builder = GsonBuilder().disableHtmlEscaping().create() 
val retrofit = Retrofit.Builder() 
     .baseUrl(baseUrl) 
     .addConverterFactory(ScalarsConverterFactory.create()) 
     .addConverterFactory(GsonConverterFactory.create(builder)) 
     .client(monoOkHttpClient()) 
     .build() 

इस निर्माता को आपके जेसन आउटपुट से भागने को हटाना चाहिए।

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