Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Android and RESTRoman Woźniak
Roman WoźniakSignlApps, Lead Android Developer  roman@signlapps.com  @wozniakr
Agenda• REST – what is it?• REST – how to use it• HTTP communication on Android• Libraries to write apps faster• HTTP comm...
REST          RESTimgsrc: https://sites.google.com/site/sleepasandroid/
REST – what is it?              REpresentational State Transfer (REST) is a style of              software architecture fo...
REST – what is it?RESTful service features• client-server architecture• stateless• resposne caching• layered system• unifo...
REST – what is it?URI structure• collections• resources• controllers            https://api.rwozniak.com/users            ...
REST – what is it?CRUD operations                      POST    =   Create                        GET   =   Read           ...
REST – what is it?Create       $ curl -v -X POST -d "..." https://api.rwozniak.com/users       > POST /users HTTP/1.1     ...
REST – what is it?Read          $ curl -v https://api.rwozniak.com/users/113          > GET /users/113 HTTP/1.1          >...
REST – what is it?Update          $ curl -v -X PUT -d "..." https://api.rwozniak.com/users/113          > PUT /users/113 H...
REST – what is it?Delete          $ curl -v -X DELETE https://api.rwozniak.com/users/113          > DELETE /users/113 HTTP...
REST – moreREST - more• HTTP resposne codes• usage of HTTP headers
REST – moreHTTP response codes• 2XX - correct• 3XX - redirects• 4XX - client fault (request)• 5XX - server fault (response)
REST – moreErrors• 400 (Bad Request)• 401 (Unauthorized)• 403 (Forbidden)• 404 (Not Found)• 500 (Internal Server Error)• 5...
REST – more          Programmers are people tooimgsrc: http://thefuturebuzz.com/wp-content/uploads/2011/10/data.jpg
REST – more           Programmer-friendly                  {                    "http_code": 400,                    "erro...
REST – moreHeaders• Accept: application/json     Accept: application/json       Accept: application/xml     {             ...
Android and HTTPAndroid and HTTP• Apache HTTP Client      – DefaultHttpClient, AndroidHttpClient      – stable, minor bugs...
Android and HTTPHttpClientpublic DefaultHttpClient createHttpClient() {  final SchemeRegistry supportedSchemes = new Schem...
Android and HTTPSimple GETString url = "https://api.rwozniak.com/users/1303";HttpGet httpGet = new HttpGet( url );//setCre...
Android and HTTPJSON parser                   {"id":131,"firstname":"John","lastname":"Doe","age":18}                     ...
Android and HTTPJSON parserpublic User parse( String response ) throws JSONException {        User user = new User();     ...
Android and HTTPimgsrc: http://www.quickmeme.com/meme/3rxotv/
Helpful libraries - Gson           Gson           • library from Google           • conversion of Java objects to JSON rep...
Helpful libraries - GsonComparisonpublic User parse( String response ) throws JSONException {        User user = new User(...
Helpful libraries - GsonMore complex classpublic class User {  public String username;  @SerializedName("account_type") pu...
Helpful libraries - CRest           CRest           • just Client REST           • makes communication with RESTful servic...
Helpful libraries - CRestExample@EndPoint("http://api.twitter.com")@Path("/1/statuses")@Consumes("application/json")public...
Helpful libraries - CRestOne-time configurationCRestBuilder crestInstance = new CRestBuilder()      .property( MethodConfi...
Helpful libraries - CRestError handlerpublic class MyErrorHandler implements ErrorHandler {    @Override    public <T> T h...
Helpful libraries - CRestCustom deserializerpublic class CustomGsonDeserializer implements Deserializer {    @Override    ...
Helpful libraries - CRestService factorypublic class ServiceFactory {    private static CRestBuilder crestInstance;    pri...
Helpful libraries - CRestFinalUser user = ServiceFactory.getUserService().create( "John", "Doe", 25 );user.age = 32;Servic...
Persistence and RESTPersistence and RESTPresentation from GoogleIO 2010      – author: Virgil Dobjanschi      – source: ht...
Persistence and RESTIncorrect implementation     Activity                   1. Get, create, update, delete   CursorAdapter...
Persistence and RESTIncorrect implementation• Application process can be killed by system• Data is not presisted for futur...
Persistence and REST    Service API                               Activity                                    CursorAdapte...
Persistence and RESTProcessor - POST and PUT                                        POST                                  ...
Persistence and RESTProcessor - DELETE and GET                                       DELETE                               ...
SummaryThings to keep in mind• always make HTTP calls in a separate thread (eg.  IntentService)• persist before and after ...
Questions          Questions?imgsrc: http://presentationtransformations.com/wp-content/uploads/2012/03/Question.jpg
Thankful I am          Thank youimgsrc: http://memegenerator.net/instance/29015891
Upcoming SlideShare
Loading in …5
×

Android and REST

18,710 views

Published on

Presentation about Android and REST given on KrakDroid conference in Cracow, Poland (15.12.2012)

Published in: Technology
  • Be the first to comment

Android and REST

  1. 1. Android and RESTRoman Woźniak
  2. 2. Roman WoźniakSignlApps, Lead Android Developer roman@signlapps.com @wozniakr
  3. 3. Agenda• REST – what is it?• REST – how to use it• HTTP communication on Android• Libraries to write apps faster• HTTP communication and databases
  4. 4. REST RESTimgsrc: https://sites.google.com/site/sleepasandroid/
  5. 5. REST – what is it? REpresentational State Transfer (REST) is a style of software architecture for distributed systems such as the World Wide Web Roy Fielding
  6. 6. REST – what is it?RESTful service features• client-server architecture• stateless• resposne caching• layered system• uniform interface
  7. 7. REST – what is it?URI structure• collections• resources• controllers https://api.rwozniak.com/users https://api.rwozniak.com/users/20 https://api.rwozniak.com/export
  8. 8. REST – what is it?CRUD operations POST = Create GET = Read PUT = Update DELETE = Delete
  9. 9. REST – what is it?Create $ curl -v -X POST -d "..." https://api.rwozniak.com/users > POST /users HTTP/1.1 > < HTTP/1.1 201 Created < Location /users/113 < Content-Length: 57 < Content-Type: application/json < [{"id":113,"firstname":"John","lastname":"Doe","age":31}]
  10. 10. REST – what is it?Read $ curl -v https://api.rwozniak.com/users/113 > GET /users/113 HTTP/1.1 > < HTTP/1.1 200 OK < Content-Length: 57 < Content-Type: application/json < {"id":113,"firstname":"John","lastname":"Doe","age":31}
  11. 11. REST – what is it?Update $ curl -v -X PUT -d "..." https://api.rwozniak.com/users/113 > PUT /users/113 HTTP/1.1 > < HTTP/1.1 200 OK < Content-Length: 57 < Content-Type: application/json < {"id":113,"firstname":"John","lastname":"Doe","age":18}
  12. 12. REST – what is it?Delete $ curl -v -X DELETE https://api.rwozniak.com/users/113 > DELETE /users/113 HTTP/1.1 > < HTTP/1.1 204 No Content < Content-Length: 0 < Content-Type: application/json <
  13. 13. REST – moreREST - more• HTTP resposne codes• usage of HTTP headers
  14. 14. REST – moreHTTP response codes• 2XX - correct• 3XX - redirects• 4XX - client fault (request)• 5XX - server fault (response)
  15. 15. REST – moreErrors• 400 (Bad Request)• 401 (Unauthorized)• 403 (Forbidden)• 404 (Not Found)• 500 (Internal Server Error)• 503 (Service Unavailable)• 418 (I’m a teapot (RFC 2324))
  16. 16. REST – more Programmers are people tooimgsrc: http://thefuturebuzz.com/wp-content/uploads/2011/10/data.jpg
  17. 17. REST – more Programmer-friendly { "http_code": 400, "error": "validation_errors", "error_title": "Set Creation Error", "error_description": "The following validation errors occurred:nYou must have a titlenBoth the terms and definitions are mandatory", "validation_errors": [ "You must have a title", "Both the terms and definitions are mandatory", "You must specify the terms language", "You must specify the definitions language" ] }src: https://quizlet.com/api/2.0/docs/api_intro/
  18. 18. REST – moreHeaders• Accept: application/json Accept: application/json Accept: application/xml { <user> "id":113, <id>113</id> "firstname":"John", <firstname>John</firstname> "lastname":"Doe", <lastname>Doe</lastname> "age":18 <age>18</age> } </user>• If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT• ETag i If-None-Match: 12331-erfwe-123331• Accept-Language: ES-CT• Accept-Encoding: gzip
  19. 19. Android and HTTPAndroid and HTTP• Apache HTTP Client – DefaultHttpClient, AndroidHttpClient – stable, minor bugs – lack of active development from Android team• HttpURLConnection – bugs in the beginning, but improved over time – transparent response compression (gzip) – response cache – active development over Android versions
  20. 20. Android and HTTPHttpClientpublic DefaultHttpClient createHttpClient() { final SchemeRegistry supportedSchemes = new SchemeRegistry(); supportedSchemes.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); supportedSchemes.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); final HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, TIMEOUT * 1000); HttpConnectionParams.setSoTimeout(params, TIMEOUT * 1000); HttpConnectionParams.setSocketBufferSize(params, 8192); HttpClientParams.setRedirecting(httpParams, false); final ClientConnectionManager ccm = new ThreadSafeClientConnManager(httpParams, supportedSchemes); return new DefaultHttpClient(ccm, httpParams);}
  21. 21. Android and HTTPSimple GETString url = "https://api.rwozniak.com/users/1303";HttpGet httpGet = new HttpGet( url );//setCredentials( httpGet );//addHeaders( httpGet );DefaultHttpClient httpClient = createHttpClient();HttpResponse httpResponse = httpClient.execute( httpGet );String responseContent = EntityUtils.toString( httpResponse.getEntity() );{"id":131,"firstname":"John","lastname":"Doe","age":18}
  22. 22. Android and HTTPJSON parser {"id":131,"firstname":"John","lastname":"Doe","age":18} public class User { public long id; public String firstname; public String lastname; public int age; }
  23. 23. Android and HTTPJSON parserpublic User parse( String response ) throws JSONException { User user = new User(); JSONObject json = new JSONObject( response ); user.id = json.getLong( "id" ); user.firstname = json.getString( "firstname" ); user.lastname = json.getString( "lastname" ); user.age = json.getInt( "age" ); return user;}
  24. 24. Android and HTTPimgsrc: http://www.quickmeme.com/meme/3rxotv/
  25. 25. Helpful libraries - Gson Gson • library from Google • conversion of Java objects to JSON representation • and the other way around • annotations • support for complex objectssrc: https://sites.google.com/site/gson/
  26. 26. Helpful libraries - GsonComparisonpublic User parse( String response ) throws JSONException { User user = new User(); JSONObject json = new JSONObject( response ); user.id = json.getLong( "id" ); user.firstname = json.getString( "firstname" ); user.lastname = json.getString( "lastname" ); user.age = json.getInt( "age" ); return user;}public User parse( String response ) { Gson gson = new Gson(); return gson.fromJson( response, User.class );}public User parse( String response ) { return new Gson().fromJson( response, User.class );}
  27. 27. Helpful libraries - GsonMore complex classpublic class User { public String username; @SerializedName("account_type") public AccountType accountType; @SerializedName("sign_up_date") public long signupDate; @SerializedName("profile_image") public String profileImage; public List<Group> groups; @Since(1.1) public String newField;}
  28. 28. Helpful libraries - CRest CRest • just Client REST • makes communication with RESTful services easier • annotations • rich configurabilitysrc: http://crest.codegist.org/
  29. 29. Helpful libraries - CRestExample@EndPoint("http://api.twitter.com")@Path("/1/statuses")@Consumes("application/json")public interface StatusService { @POST @Path("update.json") Status updateStatus( @FormParam("status") String status, @QueryParam("lat") float lat, @QueryParam("long") float longitude); @Path("{id}/retweeted_by.json") User[] getRetweetedBy( @PathParam("id") long id, @QueryParam("count") long count, @QueryParam("page") long page); @Path("followers.json") User[] getFollowers(@QueryParam("user_id") long userId);}CRest crest = CRest.getInstance();StatusService statusService = crest.build(StatusService.class);User[] folowers = statusService.getFollowers(42213);
  30. 30. Helpful libraries - CRestOne-time configurationCRestBuilder crestInstance = new CRestBuilder() .property( MethodConfig.METHOD_CONFIG_DEFAULT_ENDPOINT, "https://api.rwozniak.com/1.0" ) .property( MethodConfig.METHOD_CONFIG_DEFAULT_ERROR_HANDLER, MyErrorHandler.class ) .setHttpChannelFactory( HttpClientHttpChannelFactory.class ) .placeholder( "auth.token", getUserAuthToken() ) .deserializeJsonWith( CustomGsonDeserializer.class );
  31. 31. Helpful libraries - CRestError handlerpublic class MyErrorHandler implements ErrorHandler { @Override public <T> T handle(Request request, Exception e) throws Exception { if( e instanceof RequestException ) { RequestException ex = (RequestException) e; Response resp = ex.getResponse(); throw new ApiException( resp.to( com.rwozniak.api.entities.ErrorResponse.class ) ); } return null; }}public class ErrorResponse { @SerializedName("http_code") public int httpCode; public String error; @SerializedName("error_title") public String errorTitle; @SerializedName("error_description") public String errorDescription; @SerializedName("validation_errors") public ArrayList<String> validationErrors;}
  32. 32. Helpful libraries - CRestCustom deserializerpublic class CustomGsonDeserializer implements Deserializer { @Override public <T> T deserialize(Class<T> tClass, Type type, InputStream inputStream, Charset charset) throws Exception { GsonBuilder builder = new GsonBuilder(); JsonParser parser = new JsonParser(); JsonElement element = parser.parse( new InputStreamReader(inputStream) ); return builder.create().fromJson( element, type ); }}
  33. 33. Helpful libraries - CRestService factorypublic class ServiceFactory { private static CRestBuilder crestInstance; private static UserService userService; private static void init( boolean authenticated ) { crestInstance = new CRestBuilder(); } private static CRestBuilder getInstance() { if( crestInstance==null ) { init(); } return crestInstance; } public static UserService getUserService() { if( userService==null ) { userService = getInstance().placeholder( "userid", getUserId() ).build().build( UserService.class ); } return userService; }}
  34. 34. Helpful libraries - CRestFinalUser user = ServiceFactory.getUserService().create( "John", "Doe", 25 );user.age = 32;ServiceFactory.getUserService().update( user );ServiceFactory.getUserService().delete( user.id );
  35. 35. Persistence and RESTPersistence and RESTPresentation from GoogleIO 2010 – author: Virgil Dobjanschi – source: http://goo.gl/R15we
  36. 36. Persistence and RESTIncorrect implementation Activity 1. Get, create, update, delete CursorAdapter Thread 3. Processing REST method Processor 5. Requery 4. Save 2. GET/POST/PUT/DELETE Memory
  37. 37. Persistence and RESTIncorrect implementation• Application process can be killed by system• Data is not presisted for future use
  38. 38. Persistence and REST Service API Activity CursorAdapter 1. execute 11. callback to Activity 8. notify ContentOberver 8. requery Service Helper2. startService(Intent) 10. Binder callback Service 3. start(param) 9. callback 4. insert/update Processor Content Provider 8. insert/update 5. start(param) 7. REST resposne REST method 6. GET/POST/PUT/DELETE
  39. 39. Persistence and RESTProcessor - POST and PUT POST 4. insert (set STATE_POSTING) Processor Content Provider 8. update (clear STATE_POSTING) REST method PUT 4. insert (set STATE_POSTING) Processor Content Provider 8. update (clear STATE_POSTING) REST method
  40. 40. Persistence and RESTProcessor - DELETE and GET DELETE 4. insert (set STATE_DELETING) Processor Content Provider 8. delete REST method GET Processor Content Provider 8. insert new resource REST method
  41. 41. SummaryThings to keep in mind• always make HTTP calls in a separate thread (eg. IntentService)• persist before and after communication• minimize HTTP communication (compression, headers)• libraries - make things easier• StackOverflow 
  42. 42. Questions Questions?imgsrc: http://presentationtransformations.com/wp-content/uploads/2012/03/Question.jpg
  43. 43. Thankful I am Thank youimgsrc: http://memegenerator.net/instance/29015891

×