2015-02-13 10 views
5
में

निम्नलिखित अनुरोध कल्पना कीजिए:को क्रमानुसार क्वेरी-पैरामीटर रेट्रोफिट

@POST("/recipes/create") 
void createRecipe(@Query("recipe") Recipe recipe, Callback<String> callback); 

मैं अपने नुस्खा है, जिस पर बिल्कुल काम नहीं करता के लिए toJson (नुस्खा) लेकिन दुर्भाग्य से मेरा अनुरोध बस बुला रहा है toString() करना चाहते हैं।

मैं पकाने की विधि के अंदर टॉस्ट्रिंग को ओवरराइड कर सकता हूं लेकिन मुझे एक सामान्य समाधान होगा।

मैं @Body उपयोग नहीं कर सकते के रूप में मैं निर्दिष्ट करने के लिए, मैं क्या भेज रहा जरूरत है (मैं जोड़ने के लिए करने के लिए "नुस्खा = json (theRecipe)" की जरूरत है।

मैं भी क्रमबद्धता को बदल नहीं सकते "नुस्खा =" के रूप में मैं सर्वर के आरोप में नहीं हूँ।

पल मैं एक QueryMap मानचित्र, जहां मैं एक धारावाहिक वस्तु में डाल उपयोग कर रहा हूँ पर। हालांकि इस काम करता है, यह मेरी राय में एक बहुत अच्छा समाधान नहीं है।

क्या मैं किसी भी तरह से रेट्रोफिट-एडाप्टर को रोक सकता हूं?

उत्तर

6

मुझे नहीं लगता कि यह अभी कुछ अच्छे तरीके से इसका समर्थन करता है। , https://github.com/square/retrofit/issues/291

है कि इसका जवाब से सुझाव विधि है कि toString() विधि ओवरराइड करता है एक कस्टम प्रकार बनाने के लिए है, क्योंकि रेट्रोफिट आंतरिक String.valueOf(value) का उपयोग करता है तार करने के लिए क्वेरी या पथ मानकों कन्वर्ट करने के लिए: लेखकों में से एक द्वारा इस जवाब की जाँच करें।

class Recipe { 
    public int id; 
    public String title; 

    @Override 
    public String toString() { 
    // You can use a GSON serialization here if you want 
    // This is not a robust implementation 
    return Integer.toString(id) + "-" + title; 
    } 
} 
+0

के भीतर मेरे क्रमिकरण की आवश्यकता है स्पष्ट रूप से समर्थन जोड़ा गया है। देखें [नीचे जवाब] (http://stackoverflow.com/a/42459356/741217) –

0

आप आर का उपयोग कर सकते हैं etrofit.RestAdapter.builder()। setConverter (...) एक कस्टम जेसन कनवर्टर पास करने के लिए।

+1

के लिए धन्यवाद त्वरित प्रतिक्रिया। मैं पहले ही कनवर्टर सेट कर चुका हूं। समस्या यह है कि कनवर्टर केवल @ बॉडी के अंदर उपयोग किया जाता है।मुझे @ क्वेरी – Frame91

3

यह जब एक कस्टम Converter.Factory कि stringConverter विधि है, जो जब मापदंडों को हल करने को कहा जाता है ओवरराइड करता है दर्ज की अब संभव है:

तो, आप कुछ इस तरह हो सकता था। Github issue कि @William को 2 साल पहले संदर्भित किया गया था, क्योंकि समर्थन जोड़ा गया था।

विधि जावाडोक:

एक स्ट्रिंग के लिए प्रकार परिवर्तित करने के लिए एक कनवर्टर देता है, या नल प्रकार इस कारखाने के द्वारा नियंत्रित नहीं किया जा सकता है। इसका उपयोग @ फ़ील्ड, @ फ़ील्डमैप मान, @ हैडर, @ हैडरमैप, @ पैथ, @Query, और @QueryMap मानों द्वारा निर्दिष्ट प्रकारों के लिए कन्वर्टर्स बनाने के लिए किया जाता है।

नीचे दिया गया उदाहरण जीसन को प्रतिनिधि करता है, लेकिन उसी तरह पैरामीटर पर किसी प्रकार का रूपांतरण लागू किया जा सकता है।

उदाहरण: GsonStringConverterFactory

class GsonStringConverterFactory 
    extends Converter.Factory { 

    private final transient Gson gson; 

    GsonStringConverterFactory(final Gson gson) { 

     this.gson = gson; 
    } 

    @Override 
    public Converter<?, String> stringConverter(final Type type, final Annotation[] annotations, final Retrofit retrofit) { 

     final TypeAdapter typeAdapter; 
     typeAdapter = gson.getAdapter(TypeToken.get(type)); 

     return new StringConverter<>(typeAdapter); 
    } 

    private static class StringConverter<T> 
      implements Converter<T, String> { 

     private final TypeAdapter<T> typeAdapter; 

     private StringConverter(final TypeAdapter<T> typeAdapter) { 

      this.typeAdapter = typeAdapter; 
     } 

     @Override 
     public String convert(final T value) 
       throws IOException { 

      /* This works in our case because parameters in this REST api are always some kind of scalar 
      * and the toJson method converts these to simple json types. */ 
      final String jsonValue; 
      jsonValue = typeAdapter.toJson(value)); 

      if (jsonValue.startsWith("\"") && jsonValue.endsWith("\"") { 
       /* Strip enclosing quotes for json String types */ 
       return jsonValue.substring(1, jsonValue.length() - 1); 
      } else { 
       return jsonValue; 
      } 
     } 
    } 
} 

कनवर्टर का पंजीयन:

कस्टम कनवर्टर रजिस्टर करने के लिए, अपने रेट्रोफिट बिल्डर कुछ इस तरह दिखाई दे सकता है:

new Retrofit.Builder().baseUrl(BASE_URL) 
          .addConverterFactory(GsonConverterFactory.create(gson)) 
          .addConverterFactory(new GsonStringConverterFactory(gson)) 
          .build(); 
संबंधित मुद्दे