We have a small app with Restlet on the GAE server and GWT and Android clients. Restlet serves GWT-serialized replies to GWT clients and JSON to Android clients.
All is ok with GWT-serialization both locally and on AppEngine production servers.
All is ok with Android (JSON) clients talking to local dev server.
Android taking to production AppEngine server GETs JSON replies, but POST fails. There is no error or warning in logs. The function on server gets called but parameter passed is null.
This is the offending code:
@Post("json")
public void createLoc开发者_JAVA百科ationJSON(Location location) { // location is always null
// do something with 'location'
}
Just to let everybody know: I managed to get GAE+Restlet+JSON+GWT working after much fiddling. The process was really chaotic (reminded me of days programing for the Win32): I was just changing settings until it started working.
The problem that I was having is:
- It was serving the wrong representation (JSON, XML, GWT) to the wrong clients. Later it turned out that I had to pay attention to the order of methods inside the class. WTF??
- I could not get it to work on sub-path, e.g. /rest/*.
I'm not going to use Restlet for the following reasons (hint to authors):
- Documentation is scarce, inaccurate and sometimes contradictory (explaining thing in different ways in different parts of documentation).
- Configuration is not standard JAX-RS. I know they have an option to configure it as JAX-RS, but all examples in docs are not based on this.
Since then I switched to Jersey.
You encountered a limitation of GAE that several Restlet users faced.
Some time ago, GAE stopped supporting accepting chunked HTTP entity. We reproduced this issue with both POST and PUT and raw GAE Servlets, so this isn't Restlet related. See GAE issue: http://code.google.com/p/googleappengine/issues/detail?id=129
The only workaround we found is to not chunk entities, meaning being able to compute their size in advance.
In Restlet 2.1 M3 version that we just released, we added a simple "entityBuffering" property on ClientResource to facilitate this (set to 'false' by default).
We are in the process of upgrading our "First Application" example to illustrate the workaround. We also had to cope with GWT 2.2 breaking compatibility with its previous GWT 2.1 core API, so Restlet 2.1 will only work on GWT.
Addition details are available on this page: http://wiki.restlet.org/docs_2.1/13-restlet/21-restlet/318-restlet/303-restlet.html
Best regards,
Jerome
Restlet ~ Founder and Technical Lead ~ http://www.restlet.org
Noelios Technologies ~ http://www.noelios.com
精彩评论