TP #3 - HTTP
Model InboxItem
Créer une classe
models.InboxItemavec les champs privés suivants (penser à générer les getters/setters) :- id (java.util.UUID)
- title (String)
- url (String)
- note (String)
Ajouter un constructeur par défaut.
Ajouter un constructeur avec les paramètres
title, url, note.Redéfinir la méthode
toString()pour qu'elle affiche les valeurs des champs.
Interface InboxItemService
- Créer une interface
services.inbox.InboxItemServiceavec les méthodes suivantes :
public interface InboxItemService {
List<InboxItem> findAll();
Optional<InboxItem> findOne(UUID id);
InboxItem save(String title, String url, String note);
InboxItem update(UUID id, String title, String url, String note);
Optional<InboxItem> delete(UUID id);
}
Cette interface modélise les accès aux données InboxItem.
Implémentation InboxItemServiceHashMap
Créer une classe
services.inbox.InboxItemServiceHashMapqui implémente l'interfaceInboxItemService.Cette implémentation consiste à stocker les données en mémoire via la structure
java.util.HashMap<UUID,InboxItem>.Pour l'implémentation de la méthode
InboxItem save(String title, String url, String note), générer un identifiant unique. Par exemple, via la classejava.util.UUID.
Contrôleur InboxApiController
Créer une classe
controllers.api.InboxApiControllerqui va gérer les accès à la ressource/api/inbox.Etendre
play.mvc.Controller.Importer le service
InboxItemService:
public class InboxApiController extends Controller {
private InboxItemService inboxItemService = new InboxItemServiceHashMap();
}
API text/plain
GET /api/inbox
Implémenter l'API
GET /api/inboxqui produit une réponse HTTP avec le code 200 et comme contenu la liste des objetsInboxItemsous la forme d'une chaîne de caractères.Implémenter l'API
GET /api/inbox/[ID]qui produit une réponse HTTP avec le code 200 et comme contenu l'objetInboxItemdont l'identifiant est fourni. Si l'identifiant n'est pas connu retourner un code 404.Pour tester vous pouvez utiliser le plugin Chrome Postman (https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop).
POST /api/inbox
- Implémenter l'API
POST /api/inboxavec les caractéristiques suivantes :- Trois informations sont attendues dans la requête HTTP :
title,urletnote. - Les données sont envoyées dans le format
application/x-www-form-urlencodeddans le corps de la requête HTTP. - Si une des informations (
title,urletnote) est manquante, renvoyer une réponse avec le code 400 et le texteles champs title, url et note sont tous obligatoires.. - Dans le cas où la sauvegarde s'est bien déroulée, renvoyer une réponse avec le code 201 et l'objet InboxItem sous la forme d'une chaîne de caractères.
- Trois informations sont attendues dans la requête HTTP :
DELETE /api/inbox/[ID]
- Implémenter l'API
DELETE /api/inbox/[ID]avec les caractéristiques suivantes :- Si l'identifiant fourni n'est pas valide, renvoyer une réponse avec le code 404.
- Si la suppression s'est bien déroulée, renvoyer un code 200.
PUT /api/inbox/[ID] (optionnel)
- Implémenter l'API
PUT /api/inbox/[ID]en s'inspirant des règles de l'APIPOST /api/inbox.
API JSON (Négociation de contenu)
Nous souhaitons à présent gérer différents formats de données :
- Ajouter le support du format JSON
- Conserver le fonctionnement initial avec le format
text/plain - Avertir l'utilisateur quand un format n'est pas supporté.
Modifier l'API
GET /api/inboxpour qu'il renvoie les données sous différentes formes suivant la valeur de l'entêteAccept:- Si
Acceptcontientapplication/json, renvoyer du JSON - Si
Acceptcontienttext/plain, renvoyer du texte. - Sinon envoyer un message d'erreur
Format xxxx non géré.
- Si
Modifier l'API
POST /api/inboxpour accepte désormais des requêtes dont les données sont envoyées au format JSON (entêteContent-Type:application/json). En cas de succès, les données renvoyées peuvent être au formatJSONoutext/plainsuivant l'entête de requêteAccept.