Retrofit: multiple query parameters in @GET command?

57,555

Solution 1

You should be using this syntax:

@GET("/my/API/call")
Response getMyThing(
    @Query("param1") String param1,
    @Query("param2") String param2);

Specifying query parameters in the URL is only for when you know both the key and value and they are fixed.

Solution 2

If you have a bunch of GET params, another way to pass them into your url is a 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>, 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("foo", "bar");
       params.put("baz", "qux");
       // ... as much as you need.

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

The URL called will be http://www.example.com/thing/?foo=bar&baz=qux

Solution 3

You can create a Map of params and send it like below:

Map<String, String> paramsMap = new HashMap<String, String>();
paramsMap.put("p1", param1);
paramsMap.put("p2", param2);

// Inside call
@GET("/my/api/call")
Response getMyThing(@QueryMap Map<String, String> paramsMap);

Solution 4

Do not write your Query params in GET-URL. Do it like this:

@GET("/my/api/call")
Response getMyThing(@Query("param1") String param1,
                    @Query("param2") String param2);

Solution 5

with Java

@GET("/my/api/call")
Response getMyThing(@Query("p1")
String param1, @Query("p2")
String param2);

with Kotlin coroutines

 @GET("/my/api/call")
 suspend fun getSearchProduct(@Query("p1") p1: String , @Query("p2") p2: String )
Share:
57,555
AndroidNoob
Author by

AndroidNoob

Updated on July 05, 2022

Comments

  • AndroidNoob
    AndroidNoob almost 2 years

    I am using Retrofit and Robospice to make API calls in my android application. All @POST methods work great, and so do @GET commands without any parameters in the URL, but I can't get any @GET calls to work with parameters on the end!

    For example, if my API path was "my/api/call/" and I wanted 2 parameters "param1" and "param2" in the URL, the get call would look like:

    http://www.example.com/my/api/call?param1=value1&param2=value2

    so I have setup my @GET interface like so:

    @GET("/my/api/call?param1={p1}&param2={p2}")
    Response getMyThing(@Path("p1")
    String param1, @Path("p2")
    String param2);
    

    but I get an error saying
    "An exception occurred during request network execution : URL query string "/my/api/call?param1={p1}&param2={p2}" on method getMyThing may not have replaced block."

    What am I doing wrong?

  • AndroidNoob
    AndroidNoob over 10 years
    I'm getting the following error now: 11-14 10:29:48.626: E//RequestRunner.java:134(31776): 10:29:48.630 Thread-11782 An exception occurred during request network execution :null I'm definitely setting the interface in my spicemanager, not sure what could be null...
  • Jake Wharton
    Jake Wharton over 10 years
    I'm not sure, sorry. I have never used RoboSpice. I'm just here for the Retrofit :)
  • Javier Tarazaga
    Javier Tarazaga about 10 years
    Hi Jake, that would we perfect in the scenario where you have to construct the query params yourself, but what about if they are given to you previosly? Imagine a template response which tell you where to fetch the info from and has those params for you to set. So /my/api/call?param1={p1}&param2={p2} is not actually created by you manually, but provided to you in the response of another call.
  • AndroidNoob
    AndroidNoob almost 8 years
    @Javier Tarazaga sorry this is late but in retrofit 1 and 2 you can use a QueryMap - see this example here
  • Hamza Khan
    Hamza Khan almost 5 years
    This is what I was looking for, we can send Multiple query params using this.
  • smrf
    smrf over 3 years
    This is a better solution I don't know why it is not selected as the best answer