web-dev-qa-db-fra.com

Java REST API client pour Android

Mon application serveur expose un service Web RESTful utilisant JAX-RS (Jersey Implementation). Quel est le meilleur moyen d'appeler ce service (autre qu'utiliser Apache HttpClient)? Je me demandais si les API clientes REST de Jersey, Restlet, RESTeasy et d'autres frameworks fonctionnaient sous Android.

Merci, Theo

29
Theo

Resteasy-mobile est une solution parfaite.

Il s'agit fondamentalement d'un système de restauration complet (qui possède une infrastructure client) mais qui utilise Apache HTTP Client plutôt que HttpURLConnection (qui n'existe pas sous Android). 

Voici plus d'informations sur l'utilisation (http://docs.jboss.org/resteasy/docs/2.3.1.GA//userguide/html_single/index.html#RESTEasy_Client_Framework)

Voici pour le maven

    <dependency>
        <groupId>org.jboss.resteasy.mobile</groupId>
        <artifactId>resteasy-mobile</artifactId>
        <version>1.0.0</version>
    </dependency>

Un petit exemple de code côté Android

    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");
    }
}

Définition du service JAX-RS (PushSVC.Java) côté Android et côté serveur

@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);

}

Modèle MessageVO définition

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;
    }
}

C'est la méthode invocation sur 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;
    }
}

C'est assez simple et tous les codes écrits sont réutilisables, le code passe-partout est presque inexistant

J'espère que cela aidera tout le monde. 

9
Le Duc Duy

Si vous voulez un peu plus de confort que de devoir utiliser URLConnection, consultez Resty for Java. Simple, léger, mais toujours aussi neuf.

http://beders.github.com/Resty

5

Couru dans celui-ci l'autre jour, je n'ai pas encore essayé, mais semble fonctionner sous Android: http://crest.codegist.org

3
zhk

Voici un bon exemple qui contient les codes sources de tout, y compris les EJB, RestEasy et Android:

http://code.google.com/p/Android-jbridge/

2
Mike

Pour les cas les plus simples, vous pouvez simplement utiliser Java.net.URL et sa méthode openConnection () pour effectuer une requête. Et ensuite, des bibliothèques de liaison de données (JAXB pour XML, Jackson pour JSON) pour gérer la réponse (et éventuellement demander si vous POST xml ou json).

0
StaxMan