Service Web REST acceptant un POST utilisant Restlet - Meilleure pratique
-
22-07-2019 - |
Question
J'ai ma ressource et sa méthode surchargée typique pour traiter les requêtes POST.
public void acceptRepresentation(Representation rep) {
if (MediaType.APPLICATION_XML.equals(rep.getMediaType())) {
//Do stuff here
}
else {
//complain!
}
}
Ce que je veux savoir, c'est la meilleure pratique pour gérer mon paquet XML. Je vois beaucoup d'exemples utilisant un formulaire - mais il existe sûrement un moyen de travailler avec l'objet Représentation lui-même ou de le convertir en un objet XML utile ???
Toute aide sur la manière dont vous devriez et analysez l'analyse du XML entrant dans votre ressource est très appréciée.
La solution
C’est plus le type de réponse que je recherchais. Merci à Thierry Boileau pour la réponse:
Vous pouvez utiliser deux types de & XML; XML représentations " ;: DomRepresentation et SaxReprésentation. Vous pouvez instancier les deux avec le représentation affichée. Par exemple.: DomRepresentation xmlRep = new DomRepresentation (rep);
DomRepresentation vous donne accès au document Dom. le SaxReprésentation vous permet d’analyser le document XML avec le vôtre contentHandler. Voir les javadocs ici 1 et ici 2.
Autres conseils
Nous le faisons actuellement avec RESTeasy, qui est une implémentation alternative de JAX-RS. Nous utilisons des liaisons JAXB (annotations) pour établir une correspondance entre le XML et nos POJO modèles, et nous spécifions un fournisseur JAXB à JAX-RS afin qu’il sache comment procéder. Ceci est décrit dans notre RESTful services Web dans Java EE avec l'article RESTEasy (JAX-RS) , ce qui peut être utile.
Mise à jour: pour Restlet, le JAXB extension est peut-être ce dont vous avez besoin.
Grâce à la méthode representation.getText ()
, vous pouvez obtenir une chaîne pouvant être introduite dans un analyseur ou un lecteur dom. SAX.
@Simon E
Je ne comprends pas: quelle implémentation REST pour Java utilisez-vous?
Je vous donne donc un exemple d'utilisation de JAX-RS (implémentation de Jersey)
La partie serveur (méthode d'une classe REST):
@POST
@Path("/upload")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public static Response upload(
@FormParam("name") String name,
@FormParam("content") String content)
throws Exception {
// NOTE: you get your content as String
// (do something here)
return Response.ok().build();
}
Partie client (méthode de certains tests JUnit):
@Test
public void uploadFile()
throws Exception {
String address = "http://0.0.0.0:8000/r/upload";
WebResource r = Client.create().resource(address);
Form form = new Form();
form.add("name", "test");
form.add("content", "SOME CONTENT GOES HERE");
String s = r.post(String.class, form);
System.out.println(s);
}
C'est ça !!!
Si vous rencontrez des problèmes lors de l'importation:
Le serveur nécessite javax.ws.rs. * Et javax.ws.rs.core. *
Le client a besoin de com.sun.jersey.api.client. * Et
com.sun.jersey.api.representation. *
De toute façon, je vous conseillerais d'utiliser JAX-RS plutôt que implémentations alternatives, car JAX-RS fera partie de la Java EE 6
à venirS'agit-il de la même procédure même dans Restlet 2.0?
J'utilise restlet 2.0m6 et voici l'extrait de code que j'utilise -
@Post
Processus de représentation publique (entité de représentation)
{
essayer
{
DomRepresentation dom = new DomRepresentation (entité);
Document d = dom.getDocument ();
.
.
} catch (exception e)
{e.printStackTrace (); }
et il lève une exception Null Pointer à la ligne dom.getDocument (). Ce qui signifie qu'aucune donnée n'est réellement arrivée.
Et mon bit flex ressemble à ceci - service var: HTTPService = new HTTPService (); service.method = " POST " ;; service.contentType = " application / xml " service.url = url; Variable: AsyncToken = service.send (paramètres);
où params est un objet XML.