URL encoding error in Retrofit 2.0 - android

#GET("images")
Call<Example> getimages(#Query("where=item_id") int item_id);
When I use this the equal to sign after where gets encode to %3D which my server doesn't accept.I want = symbol after where in my api call.
And my link is
images?where=item_id=1

Try this way:
#GET("images")
Call<Example> getimages(#Query("where") String item_id);
When you call this method, you have to pass this way:
Service service = retrofit.create(Service.class);
Call<Example> call = service.getimages("item_id=1");
If you can call your Api successfully, you can pass the value dynamically, using string concatenation.
Reason: When passing query parameters you just have to write query parameter in #Query("") and value to it will be assigned on runtime when you will call this method and pass value to "item_id" parameter of getimages method.
To learn more on Retrofit, refer this link: https://futurestud.io/tutorials/tag/retrofit

Add encoded flag.
#GET("images")
Call<Example> getimages(#Query("where=item_id", encoded = true) String item_id);
and encode item_id before pass it to this method.

Related

Android: Path parameters in HTTP get method by retrofit

I have this api link:
http://www.xxxx.com/?apikey=mykey&i=tt036543
Now by retrofit I am trying to call this api with GET method so I can create this interface:
#GET("/?apikey=mykey&i={movie_id}")
Call<MovieDetailEntity> getSearchedMovie(#Path("movie_id") String id);
But I got this error:
java.lang.IllegalArgumentException: URL query string "apikey=mykey&i={movie_id}" must not have replace block. For dynamic query parameters use #Query.
for method BatmanService.getSearchedMovie
If I use this Query :
#GET("/?apikey=mykey&i=")
Call<MovieDetailEntity> getSearchedMovie(#Query("movie_id") String id);
Then the link changes to :
http://www.xxxx.com/?apikey=mykey&i=&movie_id=tt036543
How can I call this api?
If I remember well once you use #query you should not set the variable at the url. It will use the string inside the #query annotation as the variable name.
This should work:
#GET("/?apikey=mykey")
Call<MovieDetailEntity> getSearchedMovie(#Query("i") String id);
And also this, if you want to pass your api key as well:
#GET("/")
Call<MovieDetailEntity> getSearchedMovie(#Query("apikey") String mykey,
#Query("i") String id);
The ? and & are automatically added for you.

Encoding in retrofit url with GET method

I am not able to add special character "&" in my endpoint of the URL.
Here is my api interface
#GET("api/v1/products/artworks/")
Call<TaskData> getLatestTaskData(#Header("Authorization") String token,
#Query("limit") Integer limit,
#Query("offset") String offset);
URL that is getting called
artworks/?limit=50&offset=0%26ordering%3D-artwork
And this is how I am calling the api
String url = Integer.toString(totalitemsCalledLatest) +"&ordering="+ ordering;
Call<TaskData>
call = taskApiInterface.getLatestTaskData("Token "+ user_token, 50, url);
My ordering string is something like &medium=1&base=2
But it converts automatically & to %26 and = to %3D
edit: assuming you are having connection problems to the api, i think you just need to remove the '/' from the end of your GET URL, like this: api/v1/products/artworks or at least that is one solution that will help you get closer to fixing your problem

Custom parameter with Retrofit2

I want to customizer my endPoint using Retrofit2 on Android but I have a doubt.
If I do that:
#GET("Search") //i.e https://api.test.com/Search?
Call<Products> getProducts(#Query("one") String one, #Query("two") String two,
#Query("key") String key)
My endPoint could be like this:
//-> https://api.test.com/Search?one=Whatever&two=here&key=SFSDF24242353434
I'm working with this endPoint:
// -> https://example.com/third-party-public/categories/category_id.json
If I use the same ideia as I explained above the result can be is:
#GET("/third-party-public/categories/")
Observable<List<Category>> getCategoryDetail(#Query(".json") String category_id);
The result could be:
// -> https://example.com/third-party-public/categories/.json=1
But I want that result
// -> https://example.com/third-party-public/categories/1.json
How can I setting my #query for get that result?
#GET("/third-party-public/categories/{category_id}.json")
Observable<List<Category>> getCategoryDetail(#Path("category_id") String category_id);
If you set a request with query it sets as query param '?'.
If the result you want is that you simply use it as in path:
#GET("Search/{fileUri}")
Call<Products> getProducts(#Path("fileUri") String fileUri);
You get the value it as "1.json".

How to use #Query in URL in Retrofit?

Hi all i call below URL using Retrofit
https://api.stackexchange.com/2.2/me?key=gQJsL7krOvbXkJ0NEI((&site=stackoverflow&order=desc&sort=reputation&access_token=HM*22z8nkaaoyjA8))&filter=default
and for that i created Interface RestInterface
//get UserId
#GET("/me&site=stackoverflow&order=desc&sort=reputation&access_token={access_token}&filter=default")
void getUserId(#Query("key") String apikey,#Path("access_token") String access_token,Callback<UserShortInfo> cb);
When i do this it always add key at the end of the URL(Output below).
I added #Query("key") as Query Parameter becoz it's dynamic.
http://api.stackexchange.com/2.2/me&site=stackoverflow&order=desc&sort=reputation&access_token=p0j3dWLIcYQCycUHPdrA%29%29&filter=default?key=gQJsL7krOvbXkJ0NEI%28%28
and that's the wrong. I got HTTP 400. Also here (( and )) converted into %28%28 and %29%29
Please help me how to make
https://api.stackexchange.com/2.2/me?key=gQJsL7krOvbXkJ0NEI((&site=stackoverflow&order=desc&sort=reputation&access_token=HM*22z8nkaaoyjA8))&filter=default
in Retrofit. I want it add #Query parameter in between URL. not at the end of the URL
Don't put query parameter inside the URL only the path parameter you can add
#GET("/me?site=stackoverflow&order=desc&sort=reputation&filter=default)
void getUserId(#Query("key") String apikey,#Query("access_token") String access_token,Callback<UserShortInfo> cb);
#Query("access_token") --> given key and value will come query URL
While sending request your URL form will like below
/me?key=?site=stackoverflow&order=desc&sort=reputation&filter=default&"your_value"&access_token="your_value"
obviously instead
#GET("/me&site=stackoverflow&order=desc&sort=reputation&access_token={access_token}&filter=default")
void getUserId(#Query("key") String apikey,#Path("access_token") String access_token,Callback<UserShortInfo> cb);
you should use
#GET("/me?site=stackoverflow&order=desc&sort=reputation&filter=default")
void getUserId(#Query("key") String apikey,#Query("access_token") String access_token,Callback<UserShortInfo> cb);
the chanege is /me& to /me? ... (and second is to use access_token as Query param too, not as a Path)
edit more explanations:
After parsing url which looks like (me&)
scheme:host/me&blablalbal=blalbla&blabla=blabla
the path is
me&blablalbal=blalbla&blabla=blabla
and there is no query paramas at all ... so adding params end with adding ?param=value at the end
but with (me?)
scheme:host/me?blablalbal=blalbla&blabla=blabla
the path is
me
and there are already some query parameters ... so addin new end with adding &param=value at the end :)

about Retrofit get and post methods parameters

I read retrofit is good for client server communication.
In this I have some doubts.
#GET("/group/{id}/users")
List<User> groupList(#Path("id") int groupId);
In get method what is group, id, users, and what is groupList(#Path("id") int groupId). What will it do exactly?
When you build a new adapter for your interface with Retrofit you specify some server as endpoint. Let's say your endpoint is http://www.example.com. After that, when you execute groupList method, Retrofit will send a GET request to the http://www.example.com/group/{id}/users, where {id} placeholder will be replaced with a value you provided with groupId parameter during method call. So, this default parameter of GET annotation is just a path that should be appended to the server name and the value for placeholder is provided at the runtime.
/group/{id}/users this your GET request url (BASE_URL + Your GET url) where your id will be replaced with groupId passed in your groupList(#Path("id") int groupId); method.
Now your final request GET URL will be
BASE_URL + /group/{your groupId passed in method}/users
finally response from server will be parsed to List<User> and returned.

Categories

Resources