REST - Representational State Transfer

Framework Restlet

Restlet

Le projet Restlet fournit un framework complet et fiable pour appliquer les concepts REST aux classes Java. Il peut être utilisé pour mettre en place tout type de système RESTful et pas seulement des web services.

Ce logiciel est né sous l'influence d'autre technologies Java pour le développement d'applications web : l'API Servlet, Java Server Pages, HttpURLConnection, et Struts.

L'objectif principal est d'offrir le même niveau de fonctionnalités tout en collant au plus près les principes de REST comme ceux exposés par la thèse de Fielding. Un autre objectif clé est de présenter une vue unifiée de la toile, pour utilisation d'applications à la fois côté client et côté serveur.

Restlet part du principe que la distinction entre le client HTTP et de serveur HTTP est sans importance au niveau de l'architecture. Le même logiciel devrait être capable d'agir aussi bien comme un client web, puis comme un serveur web, sans l'aide de deux API complètement différentes.

Dans l'API Restlet on retrouve les même concepts REST tels que ressources, représentations, les liens, ...
Il y a le class abstraite Uniform qui est à la base de l'API et comme d'après son nom cette classe expose des méthodes dans une interface uniforme comme définie au sens de REST.

L'API Restlet

Exemple

On pourra utiliser notre exemple de collection de livre pour montrer comment on peut parvenir à cibler des ressources.

Le code suivant montre comment définir un livre :

public class Book extends Resource {
    String title;
    String description;

    public UserResource(Context context, Request request, Response response) {
        super(context, request, response);
        this.title = (String) request.getAttributes().get("title");
        this.description = (String) request.getAttributes().get("description");
        // Ici on ajoute la representation exposee
        getVariants().add(new Variant(MediaType.TEXT_PLAIN));
    }

    @Override
    public Representation getRepresentation(Variant variant) {
        Representation result = null;
        if (variant.getMediaType().equals(MediaType.TEXT_PLAIN)) {
            result = new StringRepresentation("Title :"
                    + this.title);
        }
        return result;
    }
}			
			

La classe Book va étendre de Resource et la méthode getAttributes() sur un objet Request va permettre de récupérer les informations relative aux messages envoyés.

public static void main(String[] args) throws Exception {
        
        Component component = new Component();
        component.getServers().add(Protocol.HTTP, 8182);

        // Creation de l'application
        Application application = new Application(component.getContext()) {
            @Override
            public Restlet createRoot() {
                // Creation d'un router
                Router router = new Router(getContext());

                // On attache des ressources au router
                router.attach("/books/{book}", Book.class);

                return router;
            }
        };

        // On fait le lien entre l'application et le component puis on le démarre
        component.getDefaultHost().attach("", application);
        component.start();
}			
			

La classe Application permet de recevoir les requêtes et la classe Router donne la possibilité d'attacher des "routes" vers les ressources. Il s'agit en fait de définir les URI pour atteindre ces ressources.