In retrofit to map json response to pojo usually we do this
@POST
Call<User> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
ApiCalls api = retrofit.create(ApiCalls.class);
Call<User> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<User>() {
//Response and failure callbacks
}
where User is my Pojo class. But for every other request i need to make different pojo and write same code for retrofit call.I want to make a single method for calling api and pass the respective pojo class to retrofit call. like this
ApiCalls api = retrofit.create(ApiCalls.class);
Call<*ClassPassed*> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<*ClassPassed*>() {
//Response and failure callbacks
}
so now i can any pojo class to single method and get the response.This is just to avoid rewriting the same code again and again.is this possible
Update To elaborate more:
Suppose I need to make two requests. First one is to get userDetails and the other is patientDetails.So i have to create two model classes User and Patient. So in retrofit api i'll be having something like this
@POST
Call<User> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
@POST
Call<Patient> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
and in my FragmentUser and FragmentPatient class i'll be doing this
ApiCalls api = retrofit.create(ApiCalls.class);
Call<User> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<User>() {
//Response and failure callbacks
}
ApiCalls api = retrofit.create(ApiCalls.class);
Call<Patient> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<Patient>() {
//Response and failure callbacks
}
but here the code is repaeting just beacuse of different pojo classes.I need to repeat the same code in every other fragments for different requests. So i need to make a generic method where it can accept any pojo class and then from fragment i'll be just passing the pojo to be mapped.
using JsonElement in Response would help:
You need to use generics. That way, you can pass the desired type into the call.
By the way, I'm no retrofit expert (I use my own stuff mostly), but I think you are using it wrong.
There is 2 ways you can do this .........
1. Generics
2. Combine all POJO into one ......
In the Generics you have to pass the method with the class. pleas have look on example .....
NOTE:- Above retrofit call TypeCast your response into
YOUR OBJECT
, so you can access its field and methodsIt is very easy to use . You have to combine your all POJO class into one and use them inside the Retrofit. please have look on below example ....
In Login API i have get JSON response like this ...
above JSON , POJO look like this
and Retrofit call look like this .....
In User API i have get JSON response like this ...
above JSON , POJO look like this
and Retrofit call look like this .....
Just combine both of above JSON response into one .....
and use Result inside Your API call ......
Note:- You directly combine your 2 POJO class and accessing it. (This is very complicate if you have response very large and provide duplication if some KEY is same with different Variable type )
My approach is make a POJO called ResponseData in which you will have an attribute Object, so you have:
When you get the response you have to parse your response.body() to the desired class. So the pros: you just have one request, instead you have to parse the response.