2014-09-10 17 views
7

मैं कुछ फोरस्क्वायर एपीआई कॉल के लिए रेट्रोफिट (वॉली से) का उपयोग करने के लिए अपने कोड को दोबारा करने की कोशिश कर रहा हूं लेकिन एक उचित उदाहरण नहीं मिला है जो दिखाता है कि क्वेरी पैरामीटर को कैसे निर्दिष्ट किया जाए जिसमें 2 मान को अल्पविराम से अलग किया गया हो।रेट्रोफिट: अनुरोध में अल्पविराम से अलग पैरामीटर कैसे निर्दिष्ट करें?

मेरे आधार यूआरएल निम्नलिखित है:

public static final String VENUES_BASE_URL = "https://api.foursquare.com/v2/venues"; 

मेरी यूआरएल के बाकी इस तरह है:

"?ll=40.7,50.2&limit=50&radius=25000&v=20140909&venuePhotos=1&oauth_token=xxyyxx"; 

मेरी इंटरफेस के लिए 1 कार्यान्वयन:

public interface Fourquare { 
    @GET("/explore?ll={p1},{p2}&limit=50&radius=25000&v=20140905&venuePhotos=1&oauth_token=xxyyxx") 
    Response getVenues(@Path("p1") String param1, 
        @Path("p2") String param2); 

} 

और फिर इस तरह का अनुरोध किया:

RestAdapter restAdapter = new RestAdapter.Builder() 
      .setEndpoint(ConfigConstants.VENUES_BASE_URL) 
      .build(); 

    Fourquare fourquare = restAdapter.create(Fourquare.class); 
    Response myResponse = fourquare.getVenues("50", "75"); 

हालांकि, इसके बाद के संस्करण मुझे निम्न त्रुटि दिया:

retrofit.RetrofitError: Fourquare.getVenues: URL query string "ll={p1},{p2}&limit=50&radius=25000&v=20140905&venuePhotos=1&oauth_token=xxyyxx" must not have replace block. 

2 कार्यान्वयन (अतः जवाब है कि क्वेरी पैरामीटर का उपयोग के कुछ को देखने के बाद। नोट: एक बार मुझे पता चल जाएगा?

@GET("/explore&limit=50&radius=25000&v=20140905&venuePhotos=1&oauth_token=xxyyxx") 
void getVenues(@Query("ll") String ll, 
         Callback<String> cb); 
इस तरह वास्तविक कॉल के साथ

: पैरामीटर कॉल मैं एक पैरामीटर के रूप टोकन) होगा

fourquare.getVenues("50,75", new Callback<String>() { 
     @Override 
     public void success(String s, Response response) { 
      Log.d(TAG, "Successful run!"); 
     } 

     @Override 
     public void failure(RetrofitError error) { 
      Log.d(TAG, "Failed run!"); 
     } 
    }); 
उपरोक्त क्रियान्वयन विफलता() विधि हमेशा कहा जाता हो रही है साथ

, इसलिए वहाँ है अभी भी मेरे कोड के साथ कुछ गलत है। क्या कोई इस कॉल को लागू करने के उचित तरीके के रूप में कुछ सुझाव दे सकता है? मुझे सबसे यकीन है कि मुद्दा "ll?" के साथ है पैरामीटर।

अद्यतन: के बाद बदल प्रवेश करने के लिए इस अंतिम url मैं रेट्रोफिट से हो रही है है: https://api.foursquare.com/v2/venues/explore&limit=50&radius=25000&v=20140909&venuePhotos=1&oauth_token=xxyyxx?ll=30.26%2C-97.74

यह Foursquare सर्वर की तरह दिखता है यूआरएल के अंत में डालूँगा पैरामीटर पसंद नहीं करता है और यह स्पष्ट रूप से ../v2/venues/explore के बाद स्पष्ट रूप से रखा जाना चाहिए क्योंकि ब्राउज़र के माध्यम से अनुरोध करने पर यह ठीक काम कर रहा है।

एपीआई से इस सीमा को पाने के लिए कोई समाधान?

तीसरा कार्यान्वयन (9/17/14)colriot सुझाव के साथ मैं अपने पिछले कार्यान्वयन के साथ 400 प्रतिक्रिया कोड को हल करने में सक्षम था। मुझे अभी भी जीएसओएन के साथ एक गति समस्या है इसलिए इसे ठीक करने के सुझावों की तलाश में। विशेष रूप से, मेरे रेट्रोफिट कार्यान्वयन को वॉली की तुलना में अपने परिणामों को प्रदर्शित करने में अधिक समय लग रहा है, इसलिए मैं सोच रहा हूं कि कॉलबैक को लागू करने का एक बेहतर तरीका है या नहीं।

Foursquare इंटरफ़ेस

public interface Fourquare { 
    @GET("/explore?limit=50&radius=25000&v=20140909&venuePhotos=1&oauth_token=xxyyxx") 
    void getVenues(@Query("ll") String ll, 
       Callback<Object> cb); 
} 

RestAdapter कॉल

RestAdapter restAdapter = new RestAdapter.Builder() 
      .setEndpoint(ConfigConstants.VENUES_BASE_URL) 
      .build(); 

    Foursquare foursquare = restAdapter.create(Foursquare.class); 

foursquare.getVenues("30.26,-97.74", new Callback<Object>() { 
     @Override 
     public void success(Object o, Response response) { 
      Log.d(TAG, "Success!"); 
      // Parse response 
      GsonBuilder gsonBuilder = new GsonBuilder(); 
      Gson gson = gsonBuilder.create(); 
      JsonParser parser = new JsonParser(); 
      String response2 = gson.toJson(o); 
      JsonObject data = parser.parse(response2).getAsJsonObject(); 

      // Populate data model 
      MetaResponse metaResponse = gson.fromJson(data.get("meta"), MetaResponse.class); 
      VenuesExploreResponse myResponse = gson.fromJson(data.get("response"), VenuesExploreResponse.class);     

      // Store results from myResponse in List 
     } 

     @Override 
     public void failure(RetrofitError error) { 
      Log.d(TAG, "Failures!"); 
     } 
    }); 

ऊपर कॉलबैक कार्यान्वयन के साथ वर्तमान मुद्दा यह है कि यह अब (के बारे में 1 सेकंड) ले जा रहा है है वॉली के साथ की तुलना में परिणामों को पार्स और दिखाने के लिए। GsonBuilder/Gson/JsonParser ब्लॉक बिल्कुल मेरी वॉली ऑन रेस्पॉन्स (स्ट्रिंग प्रतिक्रिया) विधि के समान है जो कि मध्यवर्ती "प्रतिक्रिया 2" ऑब्जेक्ट को छोड़कर, इसलिए निश्चित रूप से यह मध्यवर्ती/अतिरिक्त चरण बाधा है। मैं जीसन पार्सिंग को बेहतर तरीके से कार्यान्वित करने के सुझावों की तलाश में हूं। यदि यह एक नए/अलग प्रश्न के रूप में बेहतर फिट हो सकता है तो मैं ऐसा करूँगा।

उत्तर

10

तो, जैसा कि हम पहले से ही पता चला समस्या ? में था लपेट ->& टाइपो। लेकिन एक और बात का उल्लेख किया जाना चाहिए कि रेट्रोफिट जटिल वस्तुओं को कॉल पैरामीटर के रूप में स्वीकार कर सकता है। फिर String.valueOf(object) ऑब्जेक्ट को क्वेरी/पथ पैरा में कनवर्ट करने के लिए बुलाया जाएगा।

आपके मामले में आप ऐसा कस्टम वर्ग को परिभाषित कर सकते हैं:

class LatLng { 
    private double lat; 
    private double lng; 

    ... 

    @Override public String toString() { 
    return String.format("%.1f,%.1f", lat, lng); 
    } 
} 

और उस तरह अपने अंतिम बिंदु विधि refactor:

  • कभी बनाएँ:

    @GET("/explore?limit=50&radius=25000&v=20140905&venuePhotos=1&oauth_token=xxyyxx") 
    void getVenues(@Query("ll") LatLng ll, Callback<String> cb); 
    

    जवाब पार्स करने के बारे में कॉलबैक में Gson ऑब्जेक्ट्स सही है। यह बहुत भारी वजन है। RestAdapter पर प्रदान किए गए एक का उपयोग करें।

  • आप JsonParser & Gson क्यों मिलाते हैं? वे मूल रूप से एक ही समस्या के लिए अलग-अलग उपकरण हैं।
  • रेट्रोफिट के अंतर्निहित कनवर्टर तंत्र के उपयोग करें;)
शब्द से कोड को

:

public class FoursquareResponse<T> { 
    private MetaResponse meta; 
    private T response; 
    // getters 
} 

कुल मिलाकर:

@GET("/explore?limit=50&radius=25000&v=20140905&venuePhotos=1&oauth_token=xxyyxx") 
void getVenues(@Query("ll") LatLng ll, Callback<FoursquareResponse<VenuesExploreResponse>> cb); 

... 

foursquare.getVenues(LatLng.valueOf(30.26, -97.74), new Callback<FoursquareResponse<VenuesExploreResponse>>() { 
    @Override 
    public void success(FoursquareResponse<VenuesExploreResponse> r, Response response) { 
     MetaResponse metaResponse = r.getMeta; 
     VenuesExploreResponse myResponse = r.getResponse(); 

     // Store results from myResponse in List 
    } 

    @Override 
    public void failure(RetrofitError error) { 
     Log.d(TAG, "Failures!"); 
    } 
}); 
+0

सुझाव के लिए धन्यवाद। मैं निश्चित रूप से उस पर प्रतिक्रिया करूँगा। जीसन पार्सिंग भाग पर कोई सुझाव? क्या मुझे इसके लिए एक नया प्रश्न जमा करना चाहिए? – cavega

+0

@cavega क्षमा करें, मैंने पहली बार तीसरे नोट को नहीं देखा है। – colriot

+0

रेट्रोफिट की अंतर्निहित जीसन पार्सिंग क्षमताओं का उपयोग करने के बारे में विस्तृत स्पष्टीकरण के लिए धन्यवाद। मैंने पूरे जेसन पार्सर/जीसन कोड को एक जीसन-विशिष्ट प्रश्न के जवाब से लिया जो मैंने थोड़ी देर पहले किया था। मैं निश्चित रूप से रेट्रोफिट के कोड पर गहरी गोता लगा रहा हूं। – cavega

0

बस अपने अल्पविराम से अलग तर्क urlencode, अल्पविराम =% सभी क्वेरी पैरामीटर जोड़ने के लिए 2

+2

रिट rofit स्वचालित रूप से क्वेरी मान एन्कोड करेगा। –

+0

@ जेकवार्टन मुझे आश्चर्य है कि क्या यह मुद्दा हो सकता है कि वास्तविक http अनुरोध करते समय रेट्रोफिट पैरामीटर का ऑर्डर कर रहा हो। क्या रेट्रॉफिट बेस यूआरएल के ठीक बाद क्वेरी पैरामीटर डालें? या पूर्ण यूआरएल के अंत में?मुझे वर्तमान में पोस्ट किए गए कोड पर 400 मिल रहा है। – cavega

+1

यह गतिशील क्वेरी को पैरामीटर क्वेरी पैरामीटर के अंत में जोड़ देगा। आप पूर्ण आउटगोइंग यूआरएल देखने के लिए लॉगिंग चालू कर सकते हैं। –

0

कोशिश (फिक्स्ड और परिवर्तनीय) मान्य क्रम में। मैं

@GET("/explore") 
Response getVenues(@Query("ll") ll, @Query("limit") limit, @Query("radius") radius, @Query("v") v, @Query("venuePhotos") venuePhotos, @Query("oauth_token") oauth_token); 

मतलब है और समारोह के साथ कॉल उसी समय लगातार पैरामीटर तय कर दी है

+0

मैं अपने 400 कोड को @colriot सुझाव के साथ फिर से हल करने में सक्षम था, लेकिन हाँ, मैं क्वेरी पैरामीटर के रूप में सभी पैरामीटर नहीं होने पर इंटरफ़ेस को फिर से कॉन्फ़िगर करने की योजना बना रहा था। प्रतिक्रिया के लिए धन्यवाद। – cavega

0

आप उपयोग कर सकते हैं @EncodedQuery:

@GET("/explore&limit=50&radius=25000&v=20140905&venuePhotos=1&oauth_token=xxyyxx") 
void getVenues(@EncodedQuery("ll") LatLng ll, Callback<String> cb); 
संबंधित मुद्दे