Appsly Android Rest


Source link: https://github.com/47deg/appsly-android-rest

THIS PROJECT IS DISCONTINUED — USE AT YOUR OWN RISK

It has been a fun and great project but it's time for us to move on. Check out our recent work that we are doing with Scala on Android. http://47deg.github.io/translate-bubble-android/ and follow us on Github and Twitter for new and exciting open source projects. Thanks for your continuing support. If you wish to take on maintenance of this library please contact us through the issue tracker.

Appsly Android REST

Async Android client library for RESTful services.

Introduction

Appsly Android REST (AKA RESTrung) is a annotation based client library to connect to RESTful services on Android with an emphasis in simplicity and performance that automatically handles the implementation for most common REST use cases. Easily handle GET, POST, PUT and DELETE requests in an elegant way.

Getting Started

Appsly Android REST allows you to declare your operations as annotated Java methods on a Java interface that you don't have to implement yourself. The interface is used to generate a automatically a proxy instance that does the actual work and taking care of all the implementation details.

Let's say we were implementing the Open Weather Forecast API to get the weather forecast for the 47 Degrees office in Ballard, Seattle. We would need to fetch json from this http endpoint and convert it's response to our Java model. This is how we'd do it.

http://api.openweathermap.org/data/2.5/weather?lat=47.663267&lon=-122.384187

@RestService public interface OpenWeatherAPI {

@GET("/weather")
  void getForecast(@QueryParam("lat") double latitude, @QueryParam("lon") double longitude, Callback<ForecastResponse> callback);
  
}
 
public class ForecastResponse {

private String name;

... getters and setters ...  
}
 
RestClient client = RestClientFactory.defaultClient(context);
 OpenWeatherAPI api = RestServiceFactory.getService(baseUrl, OpenWeatherAPI.class, client);
 // hold on to the api object for the lifecycle of your app or activity context 
// somewhere else in your code  api.getForecast(47.663267, -122.384187, new Callback<ForecastResponse>() {

@Override
  public void onResponse(Response<ForecastResponse> response) {

// This will be invoke in the UI thread after serialization with your objects ready to use
  
}
  
}
);
 

Download

Gradle Dependency

Appsly Android REST may be automatically imported into your project if you already use the Android Gradle Build System. Just declare Appsly Android REST as a gradle dependency. If you wish to always use the latest unstable snapshots, add the Clinker Snapshots repository where the Appsly Android REST snapshot artifacts are being deployed. Appsly Android REST official releases will be made available at Clinker and Maven Central as they become available

SNAPSHOTS

Gradle

maven {
 url 'http://clinker.47deg.com/nexus/content/groups/public' 
}
  dependencies {

  compile ('ly.apps:android-rest:1.2.1-SNAPSHOT@aar') {

transitive = true

changing = true
  
}
 
}

Configuration

Annotations

@RestService

Indicates an interface is to be proxied and its methods mapped to rest operations

@RestService public interface MyAwesomeService {
 ... 
}

@GET

Indicates a method is mapped to an HTTP GET request

@GET("/resource/{
id
}
") void fetch(@Path("id") String id);

@POST

Indicates a method is mapped to an HTTP POST request

@POST("/resource") void add(@Body MyRequest request);

@PUT

Indicates a method is mapped to an HTTP PUT request

@PUT("/resource") void fetch(@Body MyRequest request);

@DELETE

Indicates a method is mapped to an HTTP DELETE request

@DELETE("/resource/{
id
}
") void remove(@Path("id") String id);

@Path

Indicates a method arg is a path parameter in the url

@GET("/resource/{
id
}
") void fetc(@Path("id") String id);

@QueryParam

Indicates a method arg is a query parameter in the url query string

@GET("/resource/list") void list(@QueryParam("limit") int limit);

@QueryParams

Indicates a method arg is a bean including properties that will be mapped to query parameters in the url query string

@GET("/resource/list") void list(@QueryParams PaginationInfo paginationInfo);

@FormField

Indicates a method arg is mapped to a post parameter

@POST("/account") void update(@FormField String username);

@FormData

Indicates a method arg is a bean including properties that will be mapped to post parameters

@POST("/account/settings") void updateSettings(@FormData AccountSettings settings);

@Header

Indicates a method arg should be sent as a request header

@GET("/resource/list") void list(@Header("X-AuthToken") String token);

@Cached

Indicates a method is mapped to a REST operation whose response may be cached. For more details on caching see Cache

@Cached @GET("/resource/list") void list();

Cache

Appsly Android REST is built with performance and flexibility in mind. It includes a cache mechanism to help with fast retrieval, caching and reusing of serialized responses.

To mark a method as @Cached you can simply annotate it providing the optional type of cache and time to live for the cached serialized response.

In the following example the Forecast information will be loaded from the cache not hitting the server if requested within 10 minutes of the first time it was requested. After the 10 minutes pass the cache will be invalidated and reloaded. This means your users will not have to wait for your Activity to load and connect to the internet each time a user visits the weather forecast for that location. Think battery saving on your application and a better end user experience.

@GET("/weather") @Cached(policy = CachePolicy.ENABLED, timeToLive = 10 * 60 * 1000) void getForecast(@QueryParam("lat") double latitude, @QueryParam("lon") double longitude, Callback<ForecastResponse> callback);
 

Policies

The cache policies available are:

  • NEVER - Never use the cache.
  • LOAD_IF_OFFLINE - Load from the cache when the app is offline.
  • LOAD_ON_ERROR - Load from cache if there is an error.
  • ENABLED - Load always from the cache if available.
  • LOAD_IF_TIMEOUT - Load from the cache when the request times out.
  • NETWORK_ENABLED - Load from the cache then refresh the cache with a network call (may call onResponse in the callback twice)

The NETWORK_ENABLED policy is particularly useful for use cases where you may display stale data on a Activity or Fragment but immediately refresh it if the content has changed since it was last requested.

Serialization

Appsly Android REST ships with the popular library Jackson for serialization and deserialization by default but provides overridable service definitions to allow for customization or plugin in different implementations

Path & Query Params Converter

The query and path param converter serializes method args into the final url and query string used to perform the request.

To provide a custom implementation override ly.apps.android.rest.converters.QueryParamsConverter and construct the RestClient by passing it as argument.

QueryParamsConverter customQueryParamsConverter = new MyCustomQueryParamsConverter();
 RestClient client = new DefaultRestClientImpl(httpClient, customQueryParamsConverter, bodyConverter);

Request and Response Body Converters

The Body Converter serializes and deserializes Beans and Objects into JSON, Post params, etc. both for Request and Response bodies

To provide a custom implementation override ly.apps.android.rest.converters.BodyConverter and construct the RestClient by passing it as argument to the DelegatingConverterService which is also the default body converter. The DelegatingConverterService evaluates all added converter in orders looking for candidates to handle the body.

DelegatingConverterService bodyConverter = new DelegatingConverterService(){
{

  addConverter(new MyCustomBodyConverter());

  addConverter(new JacksonBodyConverter());

  addConverter(new JacksonHttpFormValuesConverter());
 
}

}
; RestClient client = new DefaultRestClientImpl(httpClient, queryParamsConverter, bodyConverter);

Async http client

Appsly Android REST uses the popular AsyncHttpClient under the hood.

You may also provide customization to the http client such as providing default headers, enabling a lower level http response cache, etc.

E.g. To customize the http client configuration you may simply pass your customized instance to the RestClient. In the case below, the default in the lib, the lower level http client http response cache is enabled. Also the serialized entity cache is enabled as well and the Persistent Cache Manager based on [LRUDiskCache]

RestClient client = new DefaultRestClientImpl(
  new CacheAwareHttpClient(new ContextPersistentCacheManager(context)) {
{

enableHttpResponseCache(10 * 1024 * 1024, new File(context.getCacheDir(), "android-rest-http"));

  
}

}
,
  new JacksonQueryParamsConverter(),
  new DelegatingConverterService(){
{

addConverter(new JacksonBodyConverter());

addConverter(new JacksonHttpFormValuesConverter());

  
}

}
 );

Request & Response Lifecycle

Callback are instances of the ResponseHandlerInterface and as such they allow for overriding the response lifecycle methods to get progress notifications, intercepting serialization at a lower level, manipulating headers, results and failures.

Credits

Appsly Android REST is a library maintained by the [47 Degrees] team and part of the OS Framework apps.ly Reaktor Appsly Android REST is inspired by other libs and projects such as Android Async Http Client, Jackson, Retrofit, LRUDiskCache, etc.

Continuous Integration

CI and Artifact Repository hosted in ClinkerHQ.com

License

Copyright (C) 2014 47 Degrees, LLC http://47deg.com [email protected]

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0 

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Resources

A library to serialize and deserialize objects with minimum memory usage.

Bubble View for Android with custom stroke width and color, arrow size, position and direction.

Progress view that animates its state changes.

Open source Android Chat SDK / Messaging SDK that lets you add real time chat and in-app messaging in your mobile (android, iOS) applications and website.

A simple progress animation, inspired by the Uber app.

Composition over inheritance

Allows to add functionality into an Android Activity. Just because we all have a BaseActivity in our projects containing too much unused stuff. When it grows, it get unmaintainable.

Topics


2D Engines   3D Engines   9-Patch   Action Bars   Activities   ADB   Advertisements   Analytics   Animations   ANR   AOP   API   APK   APT   Architecture   Audio   Autocomplete   Background Processing   Backward Compatibility   Badges   Bar Codes   Benchmarking   Bitmaps   Bluetooth   Blur Effects   Bread Crumbs   BRMS   Browser Extensions   Build Systems   Bundles   Buttons   Caching   Camera   Canvas   Cards   Carousels   Changelog   Checkboxes   Cloud Storages   Color Analysis   Color Pickers   Colors   Comet/Push   Compass Sensors   Conferences   Content Providers   Continuous Integration   Crash Reports   Credit Cards   Credits   CSV   Curl/Flip   Data Binding   Data Generators   Data Structures   Database   Database Browsers   Date &   Debugging   Decompilers   Deep Links   Dependency Injections   Design   Design Patterns   Dex   Dialogs   Distributed Computing   Distribution Platforms   Download Managers   Drawables   Emoji   Emulators   EPUB   Equalizers &   Event Buses   Exception Handling   Face Recognition   Feedback &   File System   File/Directory   Fingerprint   Floating Action   Fonts   Forms   Fragments   FRP   FSM   Functional Programming   Gamepads   Games   Geocaching   Gestures   GIF   Glow Pad   Gradle Plugins   Graphics   Grid Views   Highlighting   HTML   HTTP Mocking   Icons   IDE   IDE Plugins   Image Croppers   Image Loaders   Image Pickers   Image Processing   Image Views   Instrumentation   Intents   Job Schedulers   JSON   Keyboard   Kotlin   Layouts   Library Demos   List View   List Views   Localization   Location   Lock Patterns   Logcat   Logging   Mails   Maps   Markdown   Mathematics   Maven Plugins   MBaaS   Media   Menus   Messaging   MIME   Mobile Web   Native Image   Navigation   NDK   Networking   NFC   NoSQL   Number Pickers   OAuth   Object Mocking   OCR Engines   OpenGL   ORM   Other Pickers   Parallax List   Parcelables   Particle Systems   Password Inputs   PDF   Permissions   Physics Engines   Platforms   Plugin Frameworks   Preferences   Progress Indicators   ProGuard   Properties   Protocol Buffer   Pull To   Purchases   Push/Pull   QR Codes   Quick Return   Radio Buttons   Range Bars   Ratings   Recycler Views   Resources   REST   Ripple Effects   RSS   Screenshots   Scripting   Scroll Views   SDK   Search Inputs   Security   Sensors   Services   Showcase Views   Signatures   Sliding Panels   Snackbars   SOAP   Social Networks   Spannable   Spinners   Splash Screens   SSH   Static Analysis   Status Bars   Styling   SVG   System   Tags   Task Managers   TDD &   Template Engines   Testing   Testing Tools   Text Formatting   Text Views   Text Watchers   Text-to   Toasts   Toolkits For   Tools   Tooltips   Trainings   TV   Twitter   Updaters   USB   User Stories   Utils   Validation   Video   View Adapters   View Pagers   Views   Watch Face   Wearable Data   Wearables   Weather   Web Tools   Web Views   WebRTC   WebSockets   Wheel Widgets   Wi-Fi   Widgets   Windows   Wizards   XML   XMPP   YAML   ZIP Codes