मापदंडों का उपयोग करके रेट्रोफिट और जीईटी


92

मैं Retrofit का उपयोग करके Google GeoCode API में एक अनुरोध भेजने का प्रयास कर रहा हूं। सेवा इंटरफ़ेस इस तरह दिखता है:

public interface FooService {    
    @GET("/maps/api/geocode/json?address={zipcode}&sensor=false")
    void getPositionByZip(@Path("zipcode") int zipcode, Callback<String> cb);
}

जब मैं सेवा को कॉल करता हूं:

OkHttpClient okHttpClient = new OkHttpClient();

RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(Constants.GOOGLE_GEOCODE_URL).setClient(new OkClient(okHttpClient)).build();

FooService service = restAdapter.create(FooService.class);

service.getPositionByZip(zipCode, new Callback<String>() {
    @Override public void success(String jsonResponse, Response response) {
       ...
    }
@Override public void failure(RetrofitError retrofitError) {
    }
});

मुझे निम्नलिखित स्टैकट्रेस प्राप्त होता है:

06-07 13:18:55.337: E/AndroidRuntime(3756): FATAL EXCEPTION: Retrofit-Idle
06-07 13:18:55.337: E/AndroidRuntime(3756): Process: com.marketplacehomes, PID: 3756
06-07 13:18:55.337: E/AndroidRuntime(3756): java.lang.IllegalArgumentException: FooService.getPositionByZip: URL query string "address={zipcode}&sensor=false" must not have replace block.
06-07 13:18:55.337: E/AndroidRuntime(3756):     at retrofit.RestMethodInfo.methodError(RestMethodInfo.java:120)
06-07 13:18:55.337: E/AndroidRuntime(3756):     at retrofit.RestMethodInfo.parsePath(RestMethodInfo.java:216)
06-07 13:18:55.337: E/AndroidRuntime(3756):     at retrofit.RestMethodInfo.parseMethodAnnotations(RestMethodInfo.java:162)
06-07 13:18:55.337: E/AndroidRuntime(3756):     at 

मैंने StackOverflow के सवाल पर एक नज़र डाली : रेट्रोफिट: @GET कमांड में कई क्वेरी पैरामीटर? लेकिन यह लागू नहीं हुआ।

मैंने यहाँ से बहुत सुंदर तरीके से कोड लिया है: http://square.github.io/retrofit/ इसलिए मुझे इस मुद्दे को समझने के लिए थोड़ा नुकसान हो रहा है।

विचार?

जवाबों:


154

AFAIK, {...}केवल एक पथ के रूप में इस्तेमाल किया जा सकता है, क्वेरी-परम के अंदर नहीं। इसके बजाय यह प्रयास करें:

public interface FooService {    

    @GET("/maps/api/geocode/json?sensor=false")
    void getPositionByZip(@Query("address") String address, Callback<String> cb);
}

यदि आपके पास पास करने के लिए कोई अज्ञात राशि है, तो आप कुछ इस तरह से उपयोग कर सकते हैं:

public interface FooService {    

    @GET("/maps/api/geocode/json")
    @FormUrlEncoded
    void getPositionByZip(@FieldMap Map<String, String> params, Callback<String> cb);
}

कैसे कई क्वेरी जोड़ सकते हैं
गिल्बर्टो इबारा

2
@ गिल्बर्टोइबारा, इरेटा, अधिक जोड़कर:void getPositionByZip(@Query("address") String address, @Query("number") String number, Callback<String> cb);
बार्ट किर्स

9
FormUrlEncoded केवल अनुरोध बॉडी के साथ HTTP विधियों पर निर्दिष्ट किया जा सकता है (उदाहरण के लिए, @POST)
jiashie

8
गलत उत्तर यहाँ, @FormUrlEncoded GET के साथ उपयोग नहीं कर सकता
mr.icetea

1
@FormUrlEncoded@GETएनोटेशन के साथ काम नहीं करता है
Black_Zerg

40

@QueryMap के बदले मेरे लिए काम किया FieldMap

यदि आपके पास GET params का एक गुच्छा है, तो उन्हें अपने url में पास करने का दूसरा तरीका है HashMap

class YourActivity extends Activity {

private static final String BASEPATH = "http://www.example.com";

private interface API {
    @GET("/thing")
    void getMyThing(@QueryMap Map<String, String> params, new Callback<String> callback);
}

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.your_layout);

   RestAdapter rest = new RestAdapter.Builder().setEndpoint(BASEPATH).build();
   API service = rest.create(API.class);

   Map<String, String> params = new HashMap<String, String>();
   params.put("key1", "val1");
   params.put("key2", "val2");
   // ... as much as you need.

   service.getMyThing(params, new Callback<String>() {
       // ... do some stuff here.
   });
}
}

नामक URL http://www.example.com/thing/?key1=val1&key2=val2 होगा


4

मैं यह भी स्पष्ट करना चाहता था कि यदि आपके पास निर्माण के लिए जटिल यूआरएल पैरामीटर हैं, तो आपको उन्हें मैन्युअल रूप से बनाने की आवश्यकता होगी। यानी यदि आपकी क्वेरी example.com/?latlng=-37,147व्यक्तिगत रूप से लैट और लैंग मान प्रदान करने के बजाय, आपको लैटरल स्ट्रिंग को बाहरी रूप से बनाने की आवश्यकता होगी, तो इसे एक पैरामीटर के रूप में प्रदान करें, अर्थात:

public interface LocationService {    
    @GET("/example/")
    void getLocation(@Query(value="latlng", encoded=true) String latlng);
}

नोट encoded=trueआवश्यक है, अन्यथा रेट्रोफिट स्ट्रिंग पैरामीटर में अल्पविराम को एन्कोड करेगा। उपयोग:

String latlng = location.getLatitude() + "," + location.getLongitude();
service.getLocation(latlng);

1

कोटलिन में काम करने का पूरा उदाहरण , मैंने अपनी एपीआई कुंजियों को 1111 से बदल दिया है ...

        val apiService = API.getInstance().retrofit.create(MyApiEndpointInterface::class.java)
        val params = HashMap<String, String>()
        params["q"] =  "munich,de"
        params["APPID"] = "11111111111111111"

        val call = apiService.getWeather(params)

        call.enqueue(object : Callback<WeatherResponse> {
            override fun onFailure(call: Call<WeatherResponse>?, t: Throwable?) {
                Log.e("Error:::","Error "+t!!.message)
            }

            override fun onResponse(call: Call<WeatherResponse>?, response: Response<WeatherResponse>?) {
                if (response != null && response.isSuccessful && response.body() != null) {
                    Log.e("SUCCESS:::","Response "+ response.body()!!.main.temp)

                    temperature.setText(""+ response.body()!!.main.temp)

                }
            }

        })

1
आप अधिक स्पष्टता के लिए getWeather (params) विधि परिभाषा रख सकते हैं?
सुपर।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.