Retrofit 2 - URL Query Parameter
Solution 1
If you specify @GET("foobar?a=5")
, then any @Query("b")
must be appended using &
, producing something like foobar?a=5&b=7
.
If you specify @GET("foobar")
, then the first @Query
must be appended using ?
, producing something like foobar?b=7
.
That's how Retrofit works.
When you specify @GET("foobar?")
, Retrofit thinks you already gave some query parameter, and appends more query parameters using &
.
Remove the ?
, and you will get the desired result.
Solution 2
I am new to retrofit and I am enjoying it. So here is a simple way to understand it for those that might want to query with more than one query: The ? and & are automatically added for you.
Interface:
public interface IService {
String BASE_URL = "https://api.test.com/";
String API_KEY = "SFSDF24242353434";
@GET("Search") //i.e https://api.test.com/Search?
Call<Products> getProducts(@Query("one") String one, @Query("two") String two,
@Query("key") String key)
}
It will be called this way. Considering you did the rest of the code already.
Call<Results> call = service.productList("Whatever", "here", IService.API_KEY);
For example, when a query is returned, it will look like this.
//-> https://api.test.com/Search?one=Whatever&two=here&key=SFSDF24242353434
Link to full project: Please star etc: https://github.com/Cosmos-it/ILoveZappos
If you found this useful, don't forget to star it please. :)
Solution 3
public interface IService {
String BASE_URL = "https://api.demo.com/";
@GET("Login") //i.e https://api.demo.com/Search?
Call<Products> getUserDetails(@Query("email") String emailID, @Query("password") String password)
}
It will be called this way. Considering you did the rest of the code already.
Call<Results> call = service.getUserDetails("[email protected]", "Password@123");
For example when a query is returned, it will look like this.
https://api.demo.com/[email protected]&password=Password@123
Alan
Updated on July 30, 2022Comments
-
Alan almost 2 years
I am using a query parameters to set the values needed by the Google Maps API.
The issue is I do not need the
&
sign for the first query parameter.@GET("/maps/api/geocode/json?") Call<JsonObject> getLocationInfo(@Query("address") String zipCode, @Query("sensor") boolean sensor, @Query("client") String client, @Query("signature") String signature);
Retrofit generates:
&address=90210&sensor=false&client=gme-client&signature=signkey
which causes the call the fail when I need it to be
address=90210&sensor=false&client=gme-client&signature=signkey
How do I fix this?
-
Alan about 8 yearsthis works. Do you happen to have any good resources on how urls are structured and all types of parameters? I am not sure what a good keyword to search for.
-
Andreas about 8 yearsSearch for
URL
, and you'll find en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax -
IgorGanapolsky almost 6 yearsWhere is authenticateUser defined/
-
Evgeny Fedin almost 5 yearsHow i can see/log full query string with parametres for requests like this?
-
Taban Cosmos almost 5 yearsI am not quite sure how to answer that question. Are you trying to log a method results that has the eg. getProducts so you can see the log? Because you can do that many ways. I don't I have that implemented but here is a project that I have implemented Retrofit awhile back. FYI, not reviewed. github.com/Cosmos-it/ILoveZappos
-
Arbaz.in over 4 yearsi want to pass id at the end like 192.168.1.1/demo/api/memberlist/6557
-
Andreas over 4 years@Arbaz.in Then I suggest you click the "Ask Question" button in the upper right corner.
-
MoxGeek almost 4 years@Arbaz.in /memberlist/{id} and set @Path("id") in your function.
-
Hila Grossbard over 2 yearsthank you for just saving me hours over hours! from your github project, I just relized that if I want to add params to my call, I'll need to change the name of my @GET method in my interface to the name of the method in the api I'm trying to use.
-
Taban Cosmos almost 2 years@HilaGrossbard, you are welcome. I am glad you found this helpful.