I can't seem to figure out how to get android annotations rest client to work I'm having 2 main issues.
A)How to parse the generic json response and get the meaningful key
B)How to add parameters
For the first problem all responses come back as a json string fomatted like this
{"success":,"message":"","data":{}}
Where success is boolean message is a string and data is going to be the main data I want to parse that may be a boolean, an array, a string or an int
I'm pretty sure I need to intercept the response and handle the code but I'm not sure how to do that
Lets use a real response that look something like this
{"success":true,"message":"random message","data":{"profile":{"id":"44","user_id":"44","name":"Matt","username":"mitch","icon":"b1da7ae15027b7d6421c158d644f3220.png","med":"2a3df53fb39d1d8b5edbd0b93688fe4a.png","map":"b7bfed1f456ca4bc8ca748ba34ceeb47.png","background":null,"mobile_background":null}}
First in my interceptor I want to see if the boolean key "success" is true and then return the data value
@EBean public class RestInterceptor implements ClientHttpRequestInterceptor { final String TAG = "rest"; @Bean AuthStore authStore; @Override public ClientHttpResponse intercept(HttpRequest request, byte[] data, ClientHttpRequestExecution execution) throws IOException{ //Need to set the api key here but nothing happens code quits // Log.d("Rest",authStore.getApiKey()); HttpHeaders headers = request.getHeaders(); headers.set("api_key",""); ClientHttpResponse resp = execution.execute(request, data); HttpStatus code = resp.getStatusCode(); if(code.value() == 200){ Log.d(TAG,"success code 200"); //valid http request but is it a valid API request? //perform some logic of if success == true in root json object //if true cast return data key } else{ Log.d(TAG,"fail code" + code.toString()); } return resp; } }
The second problem is sending params with the http request that have an api key and a session key, I define the application class like this
@EApplication public class MyApp extends Application { final String TAG = "app"; @Bean AuthStore authStore; @RestService RestClient restClient; public void onCreate() { super.onCreate(); init(); } @AfterInject public void init() { authStore.setApiKey("dummy_key"); Log.d(TAG, "api key set to " + authStore.getApiKey()); } }
With the AuthStore class like this
@EBean(scope = Scope.Singleton) public class AuthStore { public String apiKey,sessionKey; public String getApiKey() { return apiKey; } public void setApiKey(String apiKey) { this.apiKey = apiKey; } public String getSessionKey() { return sessionKey; } public void setSessionKey(String sessionKey) { this.sessionKey = sessionKey; } }
Basically I'm setting a dummy api key at the application level in a singleton, which I should be able to access in the rest interceptor interface but the code just quits without errors I'm basically following this guide https://github.com/excilys/androidannotations/wiki/Authenticated-Rest-Client
Finally I have an activity class which injects the app dependency which has refrence to the rest http class and the authstore class
@EActivity(R.layout.activity_login) public class LoginActivity extends Activity { @App MyApp app; @ViewById TextView email; @ViewById TextView password; @ViewById Button loginButton; @AfterInject public void init() { Log.d(app.TAG, "api in login key set to " + app.authStore.getApiKey()); } @Click @Trace void loginButton() { login(email.toString(), password.toString()); } @Background void login(String email, String password) { app.restClient.forceLogin(); } }
Sorry if it's a lot of info, I've been searching for a while and can't figure this out!
thanks in advance