Meine Serveranwendung macht einen RESTful-Webdienst mit JAX-RS (Jersey Implementation) verfügbar. Wie kann dieser Dienst am besten aufgerufen werden (außer mit Apache HttpClient)? Ich habe mich gefragt, ob die REST Client-APIs von Jersey, Restlet, RESTeasy und anderen Frameworks unter Android funktionieren.
Danke, Theo
Resteasy-mobile ist eine perfekte Lösung.
Es ist im Grunde ein vollwertiger Resteasy (der ein Client-Framework besitzt), verwendet jedoch den Apache HTTP-Client anstelle von HttpURLConnection (die auf Android nicht vorhanden ist).
Weitere Informationen zur Verwendung finden Sie hier (http://docs.jboss.org/resteasy/docs/2.3.1.GA//userguide/html_single/index.html#RESTEasy_Client_Framework).
Hier ist für den Maven
<dependency>
<groupId>org.jboss.resteasy.mobile</groupId>
<artifactId>resteasy-mobile</artifactId>
<version>1.0.0</version>
</dependency>
Ein kleiner Beispielcode auf Android-Seite
public class RestServices {
static RegisterSVC registerSVC;
static PushSVC pushSVC;
static TrackerSVC trackerSVC;
RestServices() {
RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
}
public static RegisterSVC getRegisterSVC() {
return ProxyFactory.create(RegisterSVC.class,"http://143.248.194.236:8080/notification");
}
public static PushSVC getPushSVC() {
return ProxyFactory.create(PushSVC.class,"http://143.248.194.236:8080/notification");
}
public static TrackerSVC getTrackerSVC() {
return ProxyFactory.create(TrackerSVC.class,"http://143.248.194.236:8080/notification");
}
}
JAX-RS-Service-Definition (PushSVC.Java) auf Android- und Serverseite
@Path("/mobile")
public interface PushSVC {
/*
Sample
curl --data '{"collapseKey":"asdf","contentList":{"aaaa":"you","ssss":"you2"}}' -X POST -H 'Content-type:application/json' -v http://localhost:8080/notification/mobile/11111/send
*/
@POST
@Path("/{uuid}/send")
@Consumes(MediaType.APPLICATION_JSON)
String sendPush( MessageVO message, @PathParam("uuid") String uuid);
}
Model MessageVO-Definition
public class MessageVO {
String collapseKey;
HashMap<String, String> contentList;
public MessageVO() {
}
public MessageVO(String collapseKey) {
this.collapseKey = collapseKey;
contentList = new HashMap<String, String>();
}
public void put(String key, String value)
{
this.contentList.put(key,value);
}
public String getCollapseKey() {
return collapseKey;
}
public HashMap<String, String> getContentList() {
return contentList;
}
}
Dies ist ein Methodenaufruf unter Android
public class Broadcast extends AsyncTask<Context,Void,Void>
{
@Override
protected Void doInBackground(Context... contexts) {
MessageVO message = new MessageVO("0");
message.put("tickerText","Ticker ne` :D");
message.put("contentTitle","Title ne` :D");
message.put("contentText","Content ne` :D");
RestServices.getPushSVC().sendPush(message,TrackInstallation.id(contexts[0]).toString());
return null;
}
}
Dies ist ziemlich einfach und alle geschriebenen Codes können wiederverwendet werden. Der Boilerplate-Code ist nahezu nicht vorhanden
Ich hoffe, das hilft allen.
Wenn Sie mehr Komfort wünschen, als sich mit URLConnection zu befassen, besuchen Sie Resty for Java. Einfach, leicht, aber immer noch ziemlich neu.
Neulich bin ich in dieses gefahren, habe es noch nicht ausprobiert, scheint aber auf Android zu funktionieren: http://crest.codegist.org
Hier ein gutes Beispiel, das Quellcodes von allem enthält, einschließlich EJBs, RestEasy und Android:
In einfachsten Fällen können Sie einfach Java.net.URL und die Methode openConnection () verwenden, um eine Anfrage zu stellen. Und dann Datenbindungsbibliotheken (JAXB für XML, Jackson für JSON), um die Antwort zu behandeln (und möglicherweise eine Anforderung, wenn Sie POST xml oder json).