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.
Related
Here is the url for the code for which delete operation is required
URL-http://something.com/Api/remove_player.php
These are the Parameters for request params - user_id, id
How to use delete API for these params?
This is the Interface class in which there is usage of #Path -
public interface ApiDeleteInterface {
#DELETE("/Api/remove_player.php")
Call<Response> getResponse(#Path("user_id") int user_id
,#Path("id") int id
);
}
#DELETE annotation is used for detlete api. What shoul we use in response inside call?
Is this the correct way to make interface ?Should the code use path or any other annotation?
There is DELETE PLAYER API which has url and params below
URL - http://something.com/Api/remove_player.php
Parameters - user_id, id.
How to make delete API using retrofit?
Use #Query instead of #Path to set url parameters.
public interface ApiDeleteInterface {
#DELETE("/Api/remove_player.php")
Call<Response> getResponse(#Query("user_id") int user_id, #Query("id") int id);
}
The resulting url would look like: /Api/remove_player.php?user_id=1&id=2
#Path is a named replacement for a value in the URL. If you want to use #Path, your URL would need to update to something like:
public interface ApiDeleteInterface {
#DELETE("/Api/user_id/{user_id}/id/{id}/remove_player.php")
Call<Response> getResponse(#Path("user_id") int user_id, #Path("id") int id);
}
check out the docs
https://square.github.io/retrofit/2.x/retrofit/index.html?retrofit2/http/Query.html
https://square.github.io/retrofit/2.x/retrofit/index.html?retrofit2/http/Path.html
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".
I'm trying to call the youtube API which looks like this:
https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=10&playlistId=UU4MePVEgmibN-KAMF4-heTA&key=<KEY>
But I'm getting the error "URL query string" part = snippet {maxResults} {playlistId} {key} "must not have replace block.For dynamic query parameters use #Query." Am I doing something wrong ?? I'm currently doing so:
#GET("playlistItems?part=snippet{maxResults}{playlistId}{key}")
Call<PlaylistItemListResponse> getPlayListItemsList(#Query("maxResults") int maxresults, #Query("playlistId") String playlistId, #Query("key") String key);
You need to fix the URL in the #GET Annotation.
Please check the Retrofit Documentation at: https://square.github.io/retrofit/2.x/retrofit/index.html?retrofit2/http/Query.html
Simple Example:
#GET("/friends")
Call friends(#Query("page") int page);
Calling with foo.friends(1) yields /friends?page=1.
Probably better for your case is using a Query Map.
#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.
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 ¶m=value at the end :)