I am working on a project that involves mobile and web clients with Google's AppEngine PAAS. I would like to use RESTFul webservices with my AppEngine app.
I have looked over Stackoverflow for references to RESTFul service frameworks that can be used with AppEngine for both web (GWT) and mobile (Android) clients. Although Restlet
seems to provide editions for AppEngine, GWT and Android, so far I've got it down to RestEasy
mostly due to this question.
There have been questions previously that discuss RESTFul frameworks but I don't think the comparisons apply well to this, now quite common, case. It would be helpful to hear experienced developers' views on the frameworks available for this set of platforms and merits versus demerits of each.
You might wish to consider using Google Cloud Endpoints, which was announced as a trusted tester feature for App Engine at Google I/O, and is now available to everyone. With Endpoints, you annotate simple Java (or Python) classes and methods to describe your API. For example, this is a simple class to get and retrieve a list of high scores from a Tic Tac Toe game:
@Api(name = "tictactoe")
public class ScoreEndpoint {
@ApiMethod(name = "scores.get")
public Score get(@Named("id") String id) {
PersistenceManager pm = getPersistenceManager();
Score score = pm.getObjectById(Score.class, id);
pm.close();
return score;
}
@ApiMethod(name = "scores.list")
public List<Score> list() {
PersistenceManager pm = getPersistenceManager();
Query query = pm.newQuery(Score.class);
return (List<Score>) pm.newQuery(query).execute();
}
}
Features
- Support for Java and Python runtimes
- Built on Google's API infrastructure - it works with many of the same tools and libraries used for Google's own APIs, such as the APIs Explorer and APIs Console
- Automatically-generated, statically-typed client libraries for Android and iOS - these libraries are using the same Google-authored Java and Objective-C libraries you would use to access other Google-provided APIs such as the Calendar API
- Dynamically-typed JS client library - again, the same library you use to access other Google-provided APIs in JS
- Built in support for OAuth 2
- Integration with the Google Plugin for Eclipse - this allows you to automatically create an API based on a model, or an App Engine application to back an existing Android app
- Support for local development - you can build and test your API using the App Engine development environment, just as with other App Engine features
Learn More
Check out the documentation for more details on using Endpoints.
You can also watch several talks from Google I/O:
- Building Mobile App Engine Backends for Android, iOS and the Web
- HTML5 and App Engine: The Epic Tag Team Take on Modern Web Apps at Scale
- Building Android Applications that Use Web APIs
I've been using spring restful services with lots of luck on GAE and have been consuming it with Android Native, Phonegap and IOS clients with no issues whatsoever.
http://blog.springsource.org/2009/03/08/rest-in-spring-3-mvc/
I respect your decision not to use Restlet, but for other browsers of this thread, I have been able to make Post work with Android/Restlet/GAE - and my knowledge and programming skills are fairly limited. I had some problems getting the Restlet Edition for Javascript to work correctly (it is still in early development), but Restlet for Android posed no problems that I can recall.
I would also like to recommend Restlet, see also other threads here
- RESTful application on Google App Engine Java?
- https://stackoverflow.com/questions/1710199/which-is-the-best-java-rest-api-restlet-or-jersey
Restlet has an edition for GAE, see http://wiki.restlet.org/docs_2.0/13-restlet/275-restlet/252-restlet.html
But there are also other libraries which come with special editions for GAE, for example:
http://code.google.com/p/xydra/wiki/RestLess
If you are looking at GAE, one choice you may consider is duyproject. It is know for it's openid library, but it also has a very light weight library for REST servlets. And with GAE you want to keep all the libraries light so you don't go over the byte limit.